It was a four-goal thriller at the Stadio San Paolo, as Milan took an early lead, Napoli turned it all around, only for Franck Kessie to convert a penalty for 2-2.
This was a head-to-head for fifth place, but also the first time Gennaro Gattuso had faced his old club as a coach. Stanislav Lobotka was confirmed in midfield and David Ospina preferred between the posts, while the Rossoneri had Hakan Calhanoglu back from injury, sending Alexis Saelemaekers to the bench.
Dries Mertens rode two tackles to waltz into the box, but Gianluigi Donnarumma got down for a splendid fingertip save to push the finish round the far post.
Lorenzo Insigne’s daisy-cutter from the edge of the area was probably going in, but it was deflected off Mertens in an offside position and struck the base of the upright.
Donnarumma was again decisive, as Mertens sauntered through the defence to set up Jose Callejon, only for the save from point-blank range.
It made a big difference, because after riding out the early pressure, Milan took the lead with their first real chance on 20 minutes.
Rebic gathered down the right, turned quickly and floated the cross to the back post for Theo Hernandez’s left-foot volley into the ground, bouncing past David Ospina.
Napoli equalised when Kalidou Koulibaly surged forward from defence and was brought down by Andrea Conti. On the resulting Insigne free kick, Donnarumma only saw it come over a crowd at the last second and parried into the path of Giovanni Di Lorenzo for the tap-in.
Mario Rui stung Donnarumma’s gloves from a tricky angle at the near post, as did Piotr Zielinski, although that wouldn’t have counted due to a Callejon push.
Alexis Saelemaekers replaced the anonymous Paqueta for the second half and Ibrahimovic tested Ospina from the edge of the box, then Mertens did some last-ditch defending on Rebic.
Napoli turned the game around completely on the hour mark, as Callejon got to the by-line and pulled back for Mertens, whose first-time strike from nine yards took a slight deflection off Alessio Romagnoli to squirm under Donnarumma’s body at the near post. The Belgian did well to get in front of Ismael Bennacer to meet the assist.
Rafael Leao came off the bench for a furious Ibrahimovic and immediately blasted just over with his weaker foot, but it was another substitute who created the equaliser. Giacomo Bonaventura was tripped by Nikola Maksimovic and Franck Kessie converted the resulting penalty, sending Ospina the wrong way.
It was a wide open game with both teams trying to win it, but Saelemaekers foolishly went into two clumsy tackles in two minutes, getting himself sent off.
Arkadiusz Milik fired a free kick over, but Milan held on down to 10 men for a point at the Stadio San Paolo. Ultimately, it's Roma who are happiest with the result, as they go clear in fifth place.
See the latest Serie A predictions and betting tips with Eurotips.co.uk
Sent off: Saelemaekers 87 (M)