Watford had taken the lead on 11 minutes, Andre Carrillo heading in after Richarlison's shot had been saved.
It could have been 2-0 but Molla Wague’s header was disallowed and Andre Gray was denied by Lukasz Fabianski with five minutes left.
The match turned when Jordan Ayew, who had hit the bar from 25 yards, pounced on Oliver McBurnie’s header to equalise.
In the 90th minute two substitutes combined for the winner, Luciano Narsingh reacting first to a parried Nathan Dyer effort.
Swansea are off the bottom of the table ahead of West Bromwich Albion's match with Arsenal on Sunday. Watford are 10th.
Watford: 2 Jan v Man City (A)
Swansea: 2 Jan v Spurs (H)