The 38-year-old fought past third seed Zverev 4-6, 6-3, 6-2, 6-4 in a night session duel, which captivated Court Philippe Chatrier over three-and-a-quarter hours.
Sixth seed Djokovic moves on to face world number one Jannik Sinner in the last four, after the Italian earlier raced past the unseeded Alexander Bublik in straight sets.
"Matches like this is one of the reasons I carry on playing and I love the competition," said Djokovic.
On centre court, last year's runner-up Zverev roared out of the blocks with a break of serve in the very first game.
That game proved the difference-maker as the only other break point generated in the entirety of the rest of the set was saved by the German as he served out the opener.
It was the first time former world number one Djokovic has dropped a set at the French Open this year.
But the 24-time major winner did not dwell on that fact.
The second set continued where the first had left off, until Djokovic engineered himself a 3-1 lead after Zverev pushed a backhand long when serving at 30-40.
The next game then produced just the second deuce of the match so far as both players began to make headway on the other's service.
Djokovic eventually consolidated a crucial hold with an ace to end the game, which lasted nearly nine minutes.
The rest of the set continued like a mirror image of the first, with Zverev battling hard but being unable to muster up many break opportunities on Djokovic's serve.