With the tie seemingly slipping away, Gonzalez produced a composed finish from a tight angle three minutes from time, capping a swift turnaround that underlined City's resilience.
His goal came shortly after Jeremy Doku had equalised with eight minutes remaining, cancelling out Southampton's surprise opener.
The underdogs had taken the lead through Finn Azaz, whose long-range strike stunned City and briefly put them on course for a major upset.
However, Pep Guardiola's side responded with urgency, and Doku proved decisive in the closing stages, assisting the winner after drawing City level.
Earlier, City had controlled much of the match despite making several changes from their midweek league win over Burnley.
Tijjani Reijnders came closest in the opening exchanges, forcing Daniel Peretz into a save that diverted his effort onto the post.
Phil Foden was influential throughout, creating a half-chance for Rayan Cherki and later missing a free-kick early in the second half.
Southampton remained organised for long periods but struggled to threaten City's defence consistently. Doku nearly added another assist late on, only for a goal-line clearance to deny Savinho.
City will now face either Chelsea or Leeds United in the final, with the two sides meeting in Sunday's other semi-final.