Nadal edged a bruising first set after blowing eight break points with a top-class tiebreak, playing adventurous shots which sapped Goffin’s energy and the world number 10 ceded the final point with a double fault.
The pair served up a sizzling second set, especially in the seventh game when Nadal finally broke the Belgian for a second time in the set at the fourth attempt after sensational rallies which had spectators in the Caja Majica rising to their feet in appreciation.
“It was a beautiful game, we both played at the very highest level and there were great points for everyone to see,” Nadal told Spanish Television.
“He (Goffin) demands the most of you, he’s one of the best in the world, one of the candidates to win the most important trophies.
“I knew I was playing well in the first set but I just couldn’t take my chances. Winning is very important but also the way I’m playing at the moment makes me very relaxed.”
Nadal has made a storming start to the claycourt season, winning the Monte Carlo Masters and the Barcelona Open for a record-extending 10th time last month.
Saturday’s match between Djokovic and Nadal will be the 50th between the two great rivals, who have won a combined 26 grand slam titles.
Djokovic has won 26 of their previous meetings including the last seven. Nadal last beat the world number two in the 2014 French Open final.
The Madrid Open started the rivalry, with the Caja Magica witnessing an engrossing semi-final in 2009 lasting over four hours which Nadal won after saving three match points.
Djokovic gets walk-over
Defending champion Djokovic reached the last four without hitting a ball as his quarter-final opponent Kei Nishikori withdrew due to a wrist injury.
The same problem forced world number eight Nishikori, seeded sixth in Madrid, to miss the Barcelona Open last month but he is hoping to be fit for next week’s Rome Masters.
Croatian Borna Coric, conqueror of world number one Andy Murray in the third round, plays Dominic Thiem of Austria later on Friday with the winner meeting German Alexander Zverev or Pablo Cuevas of Uruguay in the semis.