Riccardo Montolivo, returning for the first time to the club where he spent seven seasons, put Milan ahead after 14 minutes and set up another goal for Matthieu Flamini while Fiorentina were fuming after Nenad Tomovic was sent off before halftime.
Josip Ilicic scored a memorable individual goal, beating four players in a run from the halfway line before rolling the ball past Sergio Romero, to help strugglers Palermo get a 3-1 win at Sampdoria, their second successive victory in Serie A.
Antonio Di Natale scored two, one with the help of a blunder by opposing goalkeeper Christian Puggioni who tried to dribble his way out of trouble, in Udinese's 3-1 win over Chievo Verona.
Di Natale's second was a brilliant volley from an almost impossible angle.
The Catania-Cagliari and Siena-Parma matches ended goalless.
Third-placed Milan, on 58 points, stayed six ahead of fourth-placed Fiorentina with Inter Milan and Lazio two points further behind. Inter host Atalanta later on Sunday (1845) and Lazio face neighbours AS Roma on Monday.
The top two in Serie A qualify for the Champions League group stage and third place earns a place in the playoff round.
Montolivo ignored the jeers from the crowd as he dispossessed David Pizarro 30 metres from goal and rolled the ball into the corner of the net from the edge of the area.
"I didn't expect an easy welcome, the fans pay to watch and they can do what they want," he told reporters.
Fiorentina were in more trouble when Tomovic was given a straight red in the 39th minute after being judged to have elbowed Stephan El Shaaraway as the two tussled for the ball.
The decision brought furious protests from Fiorentina players who surrounded the referee to remonstrate.
Fiorentina playmaker Stevan Jovetic, surprisingly included despite a recent thigh strain, then limped off after appearing to aggravate the injury to complete a nightmare first half for the hosts.
Milan appeared to be home and dry when Flamini scored in the 62nd minute from a chance created by Montolivo but instead Fiorentina hit back.
A mazy Adem Ljajic run in the area ended with his legs crumpling after the slightest of touches from Antonio Nocerino and the Serbian converted the penalty himself in the 66th minute.
Seven minutes later, Fiorentina were awarded another penalty when Juan Cuadrado was tripped and Pizarro stepped up to fire home and atone for his earlier mistake.
Milan could have had a penalty in stoppage time when Sebastian Roncaglia blocked Ignazio Abete's shot with his hand, although it appeared to be accidental.
"I won't say anything about the referee, he had a tough job in difficult conditions," said Milan coach Massimiliano Allegri. "He made a decision that made one team happy and then he made others that made the other team happy."
"We played well in the first half but in the second we were off form, mentally speaking. We should have managed possession of the ball better, we shouldn't have conceded the second goal and we shouldn't have thought that the game was already over."
At the bottom, Palermo's win kept them 19th in the 20-team table and put them level on 27 points with Siena and Genoa. The Sicilians had not won for 15 games before beating Roma last week.