Den första semifinalen spelades i Turin häromveckan och slutade 1-1, så Juve var tvunget att göra minst ett mål för att ha en chans att slå ut Romklubben i tisdagens retur på Stadio Olimpico.
Och det var nära i den första halvleken. Inte minst när Mirko Vucinic såg ut att bli neddragen i höjd med Lazios kortlinje av Federico Marchetti. Men domaren uppfattade ingen regelvidrighet och blåste följaktligen hörna i stället för straff.
Efter en halvtimme var rollerna ombytta och Miroslav Klose skrek efter straff efter att ha blivit bryskt tacklad av Mauricio Isla. Inte heller den gången kom någon avblåsning.
En stund efter paus spräcktes nollan och det var Lazio som hittade rätt. Cristian Ledesma spelade fram Alvaro Gonzalez som nickade in 1-0. Därmed invaggades Lazio i ett falskt lugn som bryskt bröts när Arturo Vidal satte den livsviktiga kvitteringen efter 90 minuter.
I det läget trodde alla att förlängning väntade, men med en sista kraftsamling lyckades Lazio återta ledningen. Inhoppande Sergio Floccari blev stor hjälte med sin 2-1-nick. Nu ställs huvudstadsklubben mot antingen Inter eller Roma i finalen som går av stapeln i maj.
Lazio: Marchetti; Konko, Biava, Ciani, Dias; Radu, Hernanes, Ledesma, Mauri, Gonzalez; Klose.
Bänken: Bizzarri, Carrizo, Zauri, Cavanda, Stankevicius, Lulic, Cana, Brocchi, Candreva, Kozak, Rozzi, Floccari.
Juventus:Storari; Barzagli, Marrone, Bonucci; Isla, Giaccherini, Padoin, Peluso, Vidal; Vucinic, Giovinco.
Bänken: Buffon, Rubinho, Lichtsteiner, Caceres, De Ceglie, Pogba, Pirlo, Marchisio, Quagliarella, Matri.