Maurizio Sarri’s title-chasers looked destined to remain seven points behind Juventus as they trailed until the 89th minute at their San Paolo stadium.
Polish striker Mariusz Stepinski’s goal on 73 minutes had put the relegation battlers from Verona ahead, with Chievo goalkeeper Stefano Sorrentino making a string of saves including from a Dries Mertens penalty.
But Milik headed in the equaliser with one minute of normal time to go with Guinean midfielder Diawara grabbing the winner deep into injury time.
“We won a game that we deserved to win,” said Sarri.
“It had seemed cursed, as we had 31 shots on goal, missed a penalty, hit the woodwork. It was one of those classic games where the team does everything right and the ball won’t go in.
“But they kept pushing and the logical conclusion was to win the match.”
Juventus’ 4-2 win over Benevento on Saturday had opened up a seven-point advantage as the Turin giants chase a seventh straight title.
But the gap is now back to four points with just seven games remaining as Napoli continue to push for a first Scudetto since 1990.
Despite dominating Napoli had little to show for their efforts, with Stepinski breaking through on Chievo’s first real chance after sloppy defending by the hosts.
A Lorenzo Tonelli header rattled the crossbar minutes later, with Sorrentino saving a curling Insigne goal-bound shot and Mertens and Piotr Zielinski also hitting wide.
But in the final minute with the whistles of the home crowd growing louder, Insigne crossed for Milik and Diawara grabbed his first Serie A goal ot ensure Napoli keep the pressure on Juventus, with the two sides still to go head-to-head in Turin on April 22.
“I have to thank the fans, because without them, we would not have won the match,” said Sarri.
“When we got the equaliser, the Stadio San Paolo turned into a cauldron and we rode that wave.”
– Lazio third as Inter, Roma stumble –
Earlier, Adem Ljajic scored the only goal for Torino to ensure former club Inter Milan missed the chance to move third.
Inter could have overtaken Roma after the capital club lost 2-0 at home against Fiorentina on Saturday.
But Luciano Spalletti’s side dropped out of the Champions League places with Lazio moving up from fifth to third after a come-from-behind 2-1 win over Udinese.
“There are moments when it doesn’t go your way, no matter how you try,” said Inter coach Spalletti.
Kevin Lasagna had put Udinese in front against Lazio when he headed in after 13 minutes, but Serie A top-scorer Ciro Immobile equalised on 26 minutes with Luis Alberto grabbing the winner nine minutes later.
“The important thing is we kept out heads and turned it around,” said Lazio coach Simone Inzaghi.
Lazio travel to Salzburg for the second leg of the Europa League quarter-final on Thursday, before taking on city rivals Roma.
Pushing for Europa League football next season, Torino are seven points off the sixth position held by AC Milan who drew 1-1 with Sassuolo.
Torino goalkeeper Salvatore Sirigu saved from Antonio Candreva and Inter captain Mauro Icardi, with Inter also hitting the woodwork twice before falling to a fourth defeat this season.
AC Milan missed the chance to close the gap on the top four, settling for a point after Nikola Kalinic’s equaliser four minutes from time cancelled out Matteo Politano’s opener for the visitors at the San Siro.
Download our app and read this and other great stories on the move. Available for Android and iOS.