In a two-leg semi-final that failed to produce a goal, the Rossoneri's goalkeeper saved two spot-kicks before Luiz Felipe blazed over wildly in sudden death to hand the initiative to Milan.
That allowed Alessio Romagnoli, a boyhood Lazio fan and former Roma player, to coolly stroke home the winning penalty and spark wild celebrations from the visitors, who will now face holders Juventus in May's final in Rome.
For Donnarumma it marks the continuation of a dramatic season that has seen him involved in a love-hate relationship with Milan's supporters, who unfurled a banner telling the goalkeeper to "get out" in a 3-0 Coppa Italia win over Verona in December.
But the youngster was pivotal to their success at Stadio Olimpico, saving from Sergej Milinkovic-Savic and Lucas Leiva in the shoot-out, sparing the blushes of Ricardo Rodriguez and Riccardo Montolivo – who failed from the spot for Milan - as well as Nikola Kalinic after the striker missed a sitter in extra-time.
Gennaro Gattuso's side, who are 13 matches unbeaten, will now head into a huge week that takes in the Milan derby with Inter and the Europa League last-16 first leg against Arsenal, while Lazio will look to rebound against Juve in Serie A.
Donnarumma came to Milan's rescue twice in the early stages, first tipping Ciro Immobile's looping header from Senad Lulic's deep left-wing cross over the top before saving Lucas Biglia's low effort from an acute angle with his legs.
Milan were all at sea defensively and a woeful Rodriguez pass was picked off by Milinkovic-Savic, who curled narrowly wide from 25 yards.
The visitors finally worked an opportunity in the 18th minute when Suso finished a mazy run with a long-range daisy-cutter that Thomas Strakosha kept out.
Re-awakening from their mini slumber, Lazio once again forced the issue - Immobile almost turning home from near the right byline after Donnarumma gave up on a long ball from Lucas.
The goalkeeper made up for that error, though, saving low from Immobile's drive after a free-flowing Lazio move.
In a match of ever-shifting momentum, Milan nearly broke through in the 56th minute when Suso slipped Davide Calabria in on the right of the area, but Strakosha made the save.
The visitors spurned another great chance when Hakan Calhanoglu fired wide at the end of a lightning break.
Lazio were left incensed that the referee blew at the end of normal time with substitute Felipe Anderson on a counter-attack and their misery almost worsened when a deflected Calhanoglu free-kick forced the best out of Strakosha - Romagnoli somehow nodding wide inside the six-yard box from the resulting corner.
The biggest chance of the night came with three minutes of extra-time remaining, though, Kalinic played in one-on-one from a rapid counter only to blaze hopelessly over the crossbar.
That led to a shootout and after Strakosha saved from Rodriguez and Montolivo the omens looked bad for Milan.
Donnarumma emphasised his status as one of the best young keepers in the game, though, by keeping out Milinkovic-Savic and Lucas' efforts.
The next seven spot-kicks were scored before Luiz Felipe's woeful effort silenced the home fans, and Romagnoli kept his cool to seal a repeat of the 2016 final between Milan and Juve.
È finita! Vittoria per il @acmilan, che dopo i calci di rigore batte la @OfficialSSLazio e si guadagna un posto in Finale dove affronterà la @juventusfc! #LazioMilan termina 4-5 ! #TIMCup pic.twitter.com/NSN3LukQwD— Serie A TIM (@SerieA_TIM) February 28, 2018
Key Opta Stats:
- This will be the second Coppa Italia final in the last three seasons for Milan and the 12th in their history.
- Milan have not conceded a goal in the last 584 minutes (all competitions).
- Lazio have not conceded goals in their last three Coppa Italia games - the last time they had such a run was in January 2004.
- Milan are unbeaten in their last 13 games (all competitions) – their longest run since December 2009.
- The last time Milan went to penalties in the Coppa Italia was in December 1995.