The hosts spurned a succession of great chances amid a relentless downpour at the Etihad Stadium but finally broke through with Silva's spectacular strike 11 minutes from time.
The Portuguese rattled a powerful left-foot drive into the top corner from the edge of the area to pierce Villa's admirable resistance.
Gundogan then wrapped up City's sixth successive Premier League win from the penalty spot in the final minute after a handball by Matty Cash.
In all City racked up 28 attempts at goal and they had numerous other openings on a night when they missed having a specialist centre forward for most of the game.
Yet Villa deserved huge credit for acquitting themselves well on their return to action. Aside from an FA Cup tie in which they fielded a youthful side, it was their first game since New Year's Day following a Covid-19 outbreak at the club.
They contributed to an entertaining game and had the occasional chance themselves, but it was a tale of their defence versus City's attack and Pep Guardiola's men ultimately prevailed.
The hosts were still fluid in attack, with Silva operating as a 'false nine', but there were still times when they could have done with the extra punch a striker might have provided as Villa repeatedly blocked shots.
The tone was set in the opening minutes as goalkeeper Emiliano Martinez somehow got a foot in the way to deny Silva what seemed a certain goal at point-blank range.
Phil Foden was thwarted by Ezri Konsa after a weaving run and Tyrone Mings got behind a Rodri effort. Rodri hit team-mate Raheem Sterling with another shot and Joao Cancelo blasted over.
City's frustration was compounded by the loss of Kyle Walker through injury after 28 minutes. The full-back did try to run off his knock but he faced an uphill task against Jack Grealish, who ran at him to tee up Bertrand Traore and was withdrawn.
Traore shot into the side-netting and Ross Barkley had opportunities when he tested Ederson and clipped another attempt wide.
City had a glorious chance before the interval when they broke following a Villa corner. Kevin De Bruyne played in Foden with a brilliant long pass but this time Cash slid in to block.
Traore threatened again when he cut inside but Ederson saved and City spurned further chances when Cancelo and Gundogan both missed the target when well placed.
Gundogan spurned an even better chance after Martinez beat out a header from Ruben Dias at a corner. The ball rebounded to Gundogan about a yard out but it got stuck between his legs and Villa escaped.
The visitors' luck finally ran out on 79 minutes after Mings lost possession to Rodri in a dangerous area.
The Spaniard found the onrushing Silva and the Portuguese cut inside before slamming a left-foot shot into the top corner from 18 yards. The relief was obvious as he raced away to slide on the saturated turf.
But Villa were left fuming after Rodri appeared to return from an offside position to capitalise on Mings' lack of control and manager Dean Smith was sent off by referee John Moss for his complaints.
City wrapped up the win in the 90th minute through Gundogan after Cash handled a header from substitute Jesus.