Garcia (2-0) allowed three hits in seven innings, walked three and struck out four to win for the first time in three starts.
St. Louis won back-to-back games for the first time since May 24 and 25 against Cincinnati.
The AL East-leading Blue Jays, who had been blanked just once this season before Saturday, went scoreless for the second straight game and matched their season-low with three hits. Shelby Miller pitched a three-hitter to beat the Blue Jays 5-0 on Saturday.
Toronto lost consecutive games for the first time since May 29-30 against Kansas City. They haven't lost three straight since dropping the first three of a four-game home series against the Angels from May 9-11. The Blue Jays had won seven series since.
The Cardinals opened the scoring with a four-run, bat-around second against Blue Jays right-hander Drew Hutchison. Peter Bourjos hit a sacrifice fly, Tony Cruz had an RBI double and Carpenter followed with a two-run homer, his first since April 4.
Peralta made it 5-0 when he led off the third with a drive to left, his team-leading 10th.
Hutchison (4-4) allowed five runs and six hits in three innings, his shortest start of the season. He walked one and struck out one.
Hutchison is 1/3 with an 8.72 ERA in five home starts and 3-1 with a 2.03 ERA in eight road starts.
Garcia had not walked a batter in four previous starts this season, but issued a pair in the first inning, with Melky Cabrera and Edwin Encarnacion both drawing free passes. Garcia struck out Brett Lawrie to strand both runners.
Bautista drew his ML-leading 50th walk in the eighth. ... Cardinals 2B Kolten Wong (left shoulder) missed his third straight game. ... The roof was open when the game began but started to close in the second inning. ... St. Louis is off Monday before opening a three-game series at Tampa Bay on Tuesday. RH Adam Wainwright (8-3) will face Rays RH Jake Odorizzi (2-6). ... Toronto begins a three game series against Minnesota on Monday. Twins RH Ricky Nolasco (4-5) faces Blue Jays RH R.A. Dickey (6-4).