The Giallorossi fell behind to Jonathan de Guzman’s header but turned it around either side of half-time through Stephan El Shaarawy and Edin Dzeko goals, with Diego Perotti’s late penalty adding some security.
With the leaders, Juve, not in action in the league this week, the victory ensured that Roma go into the winter break only four points behind their title rivals.
Lorenzo Insigne’s stunning effort gave Napoli an early advantage but Bernardeschi pegged them back, later grabbing his second in sumptuous style after the visiting winger Dries Mertens had continued his impressive streak in front of goal.
With eight minutes remaining, the substitute Mauro Zarate turned in Bernardeschi’s classy centre, only for Manolo Gabbiadini to frustrate the Tuscan side from the penalty spot deep into stoppage time.
Marco Sau scored twice as Cagliari fought back to secure a dramatic 4-3 victory over 10-man Sassuolo. The Sardinian team were ahead after 14 minutes thanks to Sau but a Sassuolo recovery saw Claud Adjapong and Lorenzo Pellegrini turn the game on its head before the latter player was dismissed for fouling Davide Di Gennaro.
Francesco Acerbi’s penalty after the interval put Sassuolo two goals ahead only for Marco Borriello’s thunderous shot and Sau’s second to level things up.
Then, with time running out, the Brazilian forward Diego Farias burst into the box and drove in a 76th-minute winner at the Stadio Sant’Elia.
Andrea Belotti heads into the winter break joint second with Roma’s Dzeko in the scoring charts after firing Torino to a 1-0 victory over Genoa. The game also featured a debut for the 15-year-old Pietro Pellegri with Genoa – he is the joint youngest player to appear in Serie A, along with Roma’s Amedeo Amadei in 1937.
Cristiano Biraghi’s stoppage-time penalty earned Pescara a share of the points with a 1-1 draw against their relegation rivals Palermo.
Robin Quaison had opened the scoring for the Sicilian side, who nevertheless climb to 18th in the table.