Fognini had lost the previous six meetings with the No.2 seed but caused an astonishing upset, in the process ending Nadal's seemingly inevitable march towards a 12th title in the event.
The result — achieved after one hour and 36 minutes on court — sees the Italian through to his first ATP Masters 1000 final, where he will take on Dusan Lajovic.
Nadal had not lost in Monte Carlo since 2015 but there had been worrying signs for the Spaniard in his prior victory over Guido Pella, as he had to rally from 4-1 down before crucially breaking serve when trailing 6-5 in the first set.
However, this time he was unable to find a way to avoid dropping a set for the first time in Monte Carlo since his second-round clash with Kyle Edmund two years ago.
Fognini recorded a break in the opening game of the contest and while Nadal immediately hit back, the former forged into a 5-4 lead to earn a chance to serve out the set.
He seized the opportunity, albeit only after a fortunate flick off the net put him 40-30 up, as a confident volley plunged Nadal into unfamiliar territory.
Few would have expected the second-set procession that followed.
Fognini reeled off five successive games in a hurry, although his charge stalled with the finishing line in sight, three match-point opportunities going begging as a break kept Nadal alive.
The left hander held in the next game to put the pressure back on his rival, but Fognini delivered on serve at the second attempt, becoming just the fourth player to beat the 'King of Clay' in the principality.