Only late tries - in the final ten minutes - by Guillem Guirado and Guillaume Bortolaso rescued the Catalans, who for long periods were under pressure from the home team.
Flanker Scott Palmer had given Treviso the lead late in the first half with a try, but Steven Meyer's penalty and Colin Gaston's try in first-half injury time gave Perpignan the lead.
Meyer scored early in the second half as well, converting his own try, to put the Catlans comfortably ahead at 15-5.
Guirado and Bortolaso struck on 71 and 74 minutes respectively to secure the bonus point, but Treviso had the last word with lock Marco Wentzel scoring.
The scorers:
For Benetton:
Tries: Palmer, Wentzel
For Perpignan:
Tries: Gaston, Meyer
Con: Meyer
Pen: Meyer
Benetton Treviso: 15 Brendan Williams, 14 Emiliano Mulieri, 13 Gabriel Pizarro, 12 Marius Goosen (capt), 11 Stuart Legg, 10 Andrea Marcato, 9 Simon Picone, 8 Dion King, 7 Scott Palmer, 6 Enrico Pavanello, 5 Marco Wentzel, 4 Antonio Pavanello, 3 Pedro di Santo, 2 Franco Sbaraglini, 1 Gianluca Faliva.
Replacements: 16 Augusto Allori, 17 Andrea Ceccato, 18 Massimiliano Perziano, 19 Michele Sutto, 20 Marco Pelizzari, 21 Zane Ansell, 22 Alberto Lucchese.
Perpignan: 15 Julien Laharrague, 14 Andre Snyman, 13 David Marty, 12 Gavin Hume, 11 Samueli Dawai Naulu, 10 Steve Meyer, 9 Nicolas Durand, 8 Rimas Alvarez Kairelis, 7 Bernard Goutta (capt), 6 Grégory Le Corvec, 5 Olivier Olibeau, 4 Colin Gaston, 3 Nicolas Mas, 2 Michel Konieck, 1 Perry Freshwater.
Replacements: 16 Guilhem Guirado, 17 Sebastien Chobet, 18 Guillaume Bortolaso, 19 Ovidiu Tonita, 20 Sylvain Dupuy, 21 Nicolas Laharrague, 22 Viliani Vaki.
Referee: Wayne Barnes