Jorginho coolly converted the decisive kick to take the Azzurri through to the final of a tournament, in which they have been the outstanding side.
They were not always on top in the game though, with Spain the better side for long spells of an epic contest before Juventus forward Federico Chiesa gave Italy the lead with a fabulous finish an hour into a match attended by a crowd of almost 58,000.
The much-maligned Alvaro Morata, who was dropped from the starting line-up here, came off the bench to equalise with 10 minutes of normal time left.
No further scoring in extra time meant penalties again for Spain, who had beaten Switzerland in a shootout in the quarter-finals.
Misses from Dani Olmo and then Morata saw Spain give up the advantage they had been handed when Manuel Locatelli failed with the first kick in the shootout.
Italy, who will play either England or Denmark in Sunday’s final at Wembley Stadium in their first showpiece since being thrashed 4-0 by Spain at Euro 2012, are looking to win the tournament for the first time since 1968.
Winger Chiesa, one of several impressive young Italian players featuring in a major tournament for the first time, was awarded the UEFA star of the match award after his superb goal put Italy ahead.
“I cannot describe my emotion by words, it was a tough match, Spain were great tonight but we come back here on July 11 for the final,” he said.
“Spain were great; they have star players but we fought until the end and we did it.
“When [Manuel] Locatelli missed the first penalty, everyone was calm saying we can do it and at the end our group helped us in the moment.”
Italy avenged their shootout defeat to Spain in the Euro 2008 quarter-finals and their resounding defeat in the Euro 2012 final, and completed a second straight European Championship victory over the Spaniards after their 2-0 win in the last 16 at Euro 2016.