Etienne Capoue sparked a dramatic second half when he fired the Hornets ahead after 47 minutes.
But teenager Freddie Hinds (59) levelled for the Sky Bet Championship side before Bobby Reid (67) grabbed his fifth goal of the season.
Watford were reduced to 10 men when Jose Holebas was sent off two minutes from time, and Niclas Eliasson added a third for City to make Adrian Mariappa's last-gasp effort irrelevant.
The Robins' city rivals Bristol Rovers also sprang a surprise by winning 1-0 away to Championship side Fulham, Ellis Harrison scoring the 13th-minute winner.
Elsewhere, and Brentford were 3-0 up away to neighbours QPR in 32 minutes through an Ariel Borysiuk own goal and efforts from John Egan and Neil Maupay.
Darnell Furlong cut the deficit close to half-time, but Joshua Clarke added a fourth for the Bees.
Crystal Palace scored their first goals under new manager Frank de Boer to beat Ipswich 2-1.
James McArthur struck twice, after 76 and 84 minutes, before Bersant Celina grabbed an injury-time consolation for Ipswich.
Middlesbrough saw off Scunthorpe 3-0 as Fabio, on-loan Chelsea man Lewis Baker and Ashley Fletcher all scored their first goals for the club.
Meanwhile, Swansea eased through 4-1 at MK Dons, despite falling behind to Ryan Seager's 17th-minute opener. Leroy Fer levelled within two minutes and the Dutchman scored a second header on the hour mark.
On-loan Chelsea youngster Tammy Abraham claimed his first Swansea goal before Jordan Ayew wrapped up victory four minutes from time.
Leicester comfortably avoided an upset with a 4-1 victory at Sheffield United. All the goals came in the second half with Demarai Gray producing a fine individual strike before Algeria striker Islam Slimani bagged a brace.
Colin Lavery pulled one back for the Blades, but Ahmed Musa had the final word in stoppage time.
Lastly, Charlton were beaten 4-1 away to Norwich City while Millwall's game with Reading went to extra time but ended in the Lions losing 3-1.