Milan - who finished with 10 men after Philippe Mexes' stoppage-time tussle with Stefano Mauri - gained an early lead in the Italian capital as former Roma man Jeremy Menez took advantage of Dusan Basta's mistake to race away and provide an accomplished finish for his 10th league goal of the season.
Miroslav Klose and Antonio Candreva were both guilty of wasting chances for the home side to equalise in the first half, but after the interval Lazio turned the match around in the space of four minutes.
First Klose set up Marco Parolo for a fine effort, before Riccardo Montolivo's misplaced pass let the former Germany international in and he made no mistake in front of goal.
Parolo then added a second inside the final 10 minutes, although it may have come at a cost with substitute Filip Djordjevic appearing to injure himself by treading on the ball in the build-up.
Victory saw Lazio climb above both Sampdoria and Napoli into third, with those sides not in action until Sunday and Monday respectively.
For Milan, defeat extended their winless run in the league to five matches, as Filippo Inzaghi's men continue to struggle to find any degree of consistency in their results.
Lazio felt they should have had a penalty in the second minute when Stefan Radu went down under a challenge from Giacomo Bonaventura, but all the Romanian received was a yellow card after protesting too much to referee Paolo Mazzoleni.
And the home side were further ruing that decision when Milan took the lead two minutes later.
Menez robbed Basta on the halfway line and broke clear before firing a low left-footed finish into the right-hand corner.
Lazio threatened an equaliser in the 18th minute, but Diego Lopez was quick to rush from his line to thwart Klose before Mexes blocked Candreva's follow-up effort.
Candreva then crossed for Klose, but the German headed wide when he ought to have brought the scores level.
The same duo were in action again midway through the half as this time Klose teed up Candreva, who scuffed his effort into the ground which allowed Lopez to make a one-handed save.
Lazio continued to press for an equaliser and felt they should have had a spot-kick for a second time when Mexes tugged on the shift of Mauri, but once again Mazzoleni waved the appeals away.
After threatening a leveller for much of the first half, one duly arrived for Lazio two minutes into the second when Klose sent in a superb cross from the right and Parolo cushioned a first-time finish into the net from 10 yards.
Klose then turned from provider to goalscorer four minutes later as he capitalised on Montolivo's mistake.
The midfielder's loose pass was wide of Mexes and Klose nipped in before slotting beyond Lopez.
With nine minutes remaining, Lazio wrapped up the points when Parolo swept in his second after Djordjevic had failed to make a telling connection on Candreva's low ball into the middle.
As tempers flared in stoppage time, Mexes grabbed Mauri by the throat having earlier been provoked, and received a straight red card to cap another miserable outing for Milan.
Elsewhere on Saturday, Luca Rossettini scored at both ends as Cagliari defeated 10-man Sassuolo 2-1.
The defender gave Cagliari the lead in the 20th minute, but then put through his own net with 14 minutes remaining.
His blushes were spared by substitute Duje Cop's winner three minutes later, before Sassuolo saw Francesco Acerbi sent off for a second caution late on.
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.