Belgian Dries Mertens netted in each half to move Napoli within two points of Roma, who had produced a late rally after Kevin Strootman reduced the deficit in the final minute.
Reina, though, was on hand to acrobatically push Diego Perotti’s deflected shot up onto the crossbar to earn Napoli a first win over Roma since November 2014.
Milan, who were unbeaten in four matches, took the lead on 24 minutes through a deflected effort from Bacca as he cut in from the left.
Chievo, who had never won a Serie A game at the San Siro, levelled from a controversial Jonathan De Guzman penalty three minutes before half-time after Mattia De Sciglio was ruled to have pulled back Serge Gakpe.
In stoppage time, Milan were awarded a spot kick for handball, but Bacca sent his penalty over the crossbar.
The Colombian, though, was on target with 20 minutes left when he converted from close range following a flick-on from a corner before substitute Gianluca Lapadula wrapped up the points for Milan with a late penalty.
Elsewhere, Sampdoria beat Pescara 3-1 to move back into the top half of the table.
Bruno Fernandes put the hosts ahead on 18 minutes, before Alberto Cerri netted an equaliser from close range.
Fabio Quagliarella headed Sampdorio back in front just before the hour mark, and substitute Patrik Schick wrapped things up with a third for the hosts on 68 minutes as the 1,000th match for Dolphins coach Zdenek Zeman ended in defeat.