Jorginho netted the decisive penalty for Italy after Dani Olmo and Alvaro Morta missed vital spot-kicks for Spain at Wembley.
The Azzurri have been among the front-runners since they opened the tournament on June 11 and they will be there when it finishes against either England or Denmark on Sunday, hoping to win a second European Championship and first since 1968.
They faced their toughest test yet against Spain, who were the better side, but when it ended 1-1 after 120 pulsating minutes, Donnarumma saved Alvaro Morata’s penalty before Chelsea midfielder Jorginho sent Italy through to another final.
Morata went from hero to villain as he had earlier climbed off the bench to equalise for Luis Enrique’s side with 10 minutes of normal time remaining – becoming his country’s all-time leading goalscorer at the Euros with six – after Federico Chiesa had put Italy in front against the run of the play.
Spain deserved to win over the course the 120 minutes, but poor finishing cost them and they were unable to replicate their penalty shoot-out victory against Switzerland in the last 16.
Roberto Mancini’s men were hanging on in extra-time and looked to have run out of steam, but they will now enjoy an extra day’s recovery and return to Wembley hoping to cap an impressive tournament where they have found different ways to win.
These two heavyweights meeting at the knock-out stages of the European Championship is a familiar sight, with this clash following previous battles in 2008, 2012 and 2016.
Their journeys to the last four had gone down differing paths, with Italy turning heads with five wins from five while Spain got this far by winning just once in 90 minutes.
Yet, Spain know their way around the back end of this competition and turned up at Wembley looking the real deal.
They hurried Italy in possession in the way no other team had managed and it reaped rewards as chances came their way, only for their finishing to let them down.
Mikel Oyarzabal had an early sight of goal but could not control the ball after being played in by Pedri, who looked every inch like the next Spanish superstar midfielder he has been billed as.
With the 18-year-old making them tick, Enrique’s side were in control, but their maverick goalkeeper Unai Simon almost gave Italy a leg-up when he came charging out for a long ball and got nowhere near it. However, Nicolo Barella did not get his shot away in time and Spain survived.
Thankfully, Pedri was much more composed and another precise pass saw Dani Olmo presented with the best chance of the first half.
The RB Leipzig striker got a second bite of the cherry after an initial shot was blocked but with time and space he put his shot too close to Donnarumma, who made a comfortable save.
More Spanish harassing created two more opportunities, but the finishing was wasteful on both occasions as Olmo could not find the target at the far post and then Oyarzabal also blazed over after a quick counter-attack.
Italy’s attack had been free-flowing throughout the tournament but their best moment came in first-half stoppage time when Chelsea defender Emerson advanced into the box and struck a fierce shot from a narrow angle, which glanced the crossbar.
Chances continued to come and go for Spain in the second half as Sergio Busquets curled inches over following an explosive break by Oyarzabal, while Donnarumma showed safe handling to keep out the Real Sociedad forward’s effort from distance.
Given their struggle to make their domination count, perhaps it was inevitable that they fell behind on the hour as they were hit by a lightning quick counter-attack.
Donnarumma collected a cross and 12 seconds later the ball was in the back of the net.
Aymeric Laporte did well to cut out Lorenzo Insigne’s incisive pass but the ball fell to Chiesa, who curled into the bottom corner from the edge of the area with deadly precision.
Spain continued to carve out the chances and they wasted two more glaring ones shortly after going behind.
Oyarzabal somehow completely missed his connection on a free header just six yards out and Olmo fizzed wide from the edge of the box.
Eventually they got their reward as Morata showed some composure in front of goal 10 minutes from time.
The former Chelsea man played a slick one-two with Olmo that split the Italian defence and coolly slotted past Donnarumma.
Spain sensed blood and Morata was the spearhead as they were pushing for a winner in normal time, but could not find a way through.
Extra time offered nothing in the way of chances that normal time had done, so it had to be decided by penalties, just as the quarter-final tie between these two teams in 2008 did.
Spain won on that occasion, but after Manuel Locatelli and Olmo each missed their country’s first spot-kick, Donnarumma kept out Morata’s low effort and then Jorgino did the rest.