Gonzalo Bergessio put the hosts ahead after only two minutes of play at the Stadio Angelo Massimino but substitute Alexander Farnerud drew Torino level in the 79th minute before Ciro Immobile netted a late winner.
The result in Sicily lifts the Granata to 10th place in the Serie A table while ending their three-game losing streak on the road.
Catania, meanwhile, suffered their fifth straight loss and are now seven points adrift of safety with only six games remaining.
The home side went in front when Pablo Barrientos fed Bergessio in the box and his right-footed shot from 15 yards beat Torino goalkeeper Daniele Padelli.
Il Toro put a good move together in the 25th minute and almost equalised.
The club's top scorer Immobile, returning from suspension, got behind Alessio Cerci's cross but his powerful header went just wide of the far post.
Catania should have doubled their lead before half-time but Bergessio put the ball wide from close range.
Torino showed a vast improvement after the restart and almost pulled level in the 57th minute.
Catania goalkeeper Mariano Andujar managed to clear Kamil Glik's goal-bound attempt from close range with his foot.
Il Toro's efforts were finally rewarded when Omar El Kaddouri set up Farnerud in the box and his left-footed strike beat Andujar.
The goal spurred the visitors on to greater things and they punished Catania again in the 83rd minute.
Riccardo Meggiorini headed a cross into Immobile's path and the Italy striker fired the ball from the middle of the area towards the far left corner and out of Andujar's reach.
The hosts did get a chance to salvage a point one minute from time, but Mariano Izco's header from Francesco Lodi's cross was kept out by Padelli.