Maurizio Sarri’s eight-time reigning Serie A champions remain second in the league, two points behind leaders Inter Milan after 15 matches.
Ronaldo put Juventus ahead at the Stadio Olimpico when he picked up a Rodrigo Bentancur cross to tap in after 25 minutes.
But Luiz Felipe hit back for the Romans in front of 60,000 fans just before the break.
Juventus were hampered by Juan Cuadrado’s sending off on 69 minutes and Lazio took control as Sergej Milinkovic-Savic connected with a Luis Alberto assist to fire in a stunning goal.
Felipe Caicedo snatched the third goal five minutes into injury time as the Romans consolidated third place with their seventh straight win.
Simone Inzaghi’s side are now just three points behind Juventus, and five adrift of Inter.