Italy's losing sequence in the Guinness Six Nations extended to a record 22 matches but France were pushed all the way before prevailing at the Stadio Olimpico.
The form of the Azzurri in the last few years - they have not won in the Championship since 2015 - has led to calls for a relegation system to be implemented in the competition.
Yet arguably only a try-saving tackle from Damian Penaud, who knocked the ball out of the hands of debutant Marco Zanon as he went for the line five minutes from time, secured victory for Les Bleus.
At the time, France led 20-14 and a converted try would have inched Italy ahead but, with a minute remaining, Penaud crossed for his side's third score as the visitors completed a hard-earned victory.
France, who had not won away from home in the last two years, fell 6-0 down following a brace of Tommaso Allan penalties but they went in ahead at the break thanks to Antoine Dupont's try, converted by Romain Ntamack, who added a penalty.
Yohan Huget's 47th-minute try gave France some breathing room but Italy responded through Tito Tebaldi before the hour - although some wayward kicking from Allan proved costly.
Conor O'Shea's Italy attacked the line in the closing stages and Zanon crossed in the left corner, only for the TMO to rule that the ball had been taken out of his hands by Penaud before touching down.
Penaud then went up the other end to score as France ended their Six Nations campaign with victory, condemning Italy to yet another defeat.