McGowan (10-8) gave up two runs on four hits and a walk. He has won two straight starts, giving up just three runs in 16 innings over the stretch.
"He had it going," Blue Jays manager John Gibbons said. "The big key was he had the slider going, probably as good as we've seen all year and he's pitched some great ballgames. He just had it rolling."
McGowan struck out seven of his final nine batters, including five consecutive at one point.
"That's probably the best game I've seen all year thrown against us," Tampa Bay manager Joe Maddon said. "Pitch-for-pitch, stuff, location. Just everything. The whole command of his game might have been the most impressive game against us this year."
McGowan threw 73 of 110 pitches for strikes.
"I felt like I had control of my own pitches," McGowan said. "I was able to get ahead most counts and put them away."
Zaun made it 6-0 on his ninth homer of the season with two outs in the sixth off Edwin Jackson (4-14). Matt Stairs, who had two RBIs, extended the lead to 7-0 on a run-scoring single later in the inning.
The Blue Jays, who began play Friday 6 1/2 games behind the New York Yankees in the AL wild-card race, have won eight of 12.
"No one in this clubhouse has given up," Toronto second baseman Aaron Hill said. "Obviously it's not over. And even if it is, we're going to play to win like we always do. Right now it's just finish strong and not worry about what's going on."
B.J. Upton had a sacrifice fly during a two-run sixth for Tampa Bay, which lost for just the fourth time in 14 games.
Jackson didn't allow a hit until there were two outs in the fifth when Hill singled to start a three-run inning that put Toronto ahead 3-0.
Hill's single came after he hit a long drive toward the left-field pole that was initially called a home run by third base umpire Dan Iassogna. After Maddon talked with Iassogna, the umpires got together and changed it to a foul ball, which TV replays showed was correct.
Jackson allowed seven runs and seven hits in 5 2-3 innings. The right-hander was coming off a rough start last Saturday, when he gave up seven runs in 3 1-3 innings in a 9-6 loss to the New York Yankees.
Upton hit a hard foul off his left ankle in the ninth, but remained in the game. Upton said he is fine, but is planning to start using protective gear Saturday so he won't hit the same spot again.
- Blue Jays DH Frank Thomas went 0-for-4, ending his hitting streak at 15 games.
- Tampa Bay scored 118 runs in its previous 13 games. That was the eighth-most by any team over a 13-game stretch since World War II.
- Stairs has 18 RBIs in his last 23 games.
- Blue Jays 3B Troy Glaus walked in the sixth. He has drawn at least one walk in eight of his last nine games.