
The 40-year-old striker rifled a low freekick into the bottom corner in the 25th minute to put the visitors ahead after a lively start, his 400th goal in total in domestic leagues.
Ibrahimovic had a brilliantly finished second ruled out for offside after the break, just like teammate Rafael Leao in the first half, before going down under Roger Ibanez’s challenge to earn a spotkick that Franck Kessie converted in the 57th.
Milan were reduced to 10 men for the final 25 minutes after leftback Theo Hernandez was shown a second yellow card, but Stephan El Shaarawy’s stoppage-time strike was not enough to rescue the game for Roma.
Victory leaves Milan second, level on 31 points with leaders Napoli and 12 points ahead of fourth-placed Roma.