The top-seeded Spaniard was pushed into a tie-break in the opening set, but eventually came through 7-6(4) 6-3.
Nadal will face defending champion Alexander Zverev who overcame fourth seed Marin Cilic of Croatia 7-6(13) 7-5 in the other semi-final.
The 21-year-old German, who won the Madrid Open last week, is the in-form player on the ATP Tour going into the French Open, chalking up his 13th win in a row to reach Sunday's final.
"It was a tough match, of course, playing against him [Novak] is always a big challenge," said Nadal.
"He played well, and it’s always the same against him; when you go down a little bit in level, he is always there and you are in big trouble. I needed to play aggressive with my forehand, that’s when I felt I was a little more in control."
Djokovic took a 26-24 lead into their 51st meeting but only second in two years, a sign of how dramatic the 30-year-old's slump has been.
Nadal claimed an early break and surged into a 5-2 lead but Djokovic fought back, winning three games in a row. But it was Nadal who lifted his level again in the tie-break, clinching it with a return that just caught the line.
The second set followed a similar pattern, although this time Djokovic was unable to reclaim the early break, and Nadal celebrated exuberantly after clinching victory with an hour and 56 minutes on the clock.
The Spaniard moves through to a final against Zverev, where victory would see him reclaim the world number one ranking, while Djokovic can head to the French Open knowing he is a contender for the biggest titles once more.
With additional reporting from PA Sport