MacKenzie Weegar had a goal and an assist, Matt Coronato and Jakob Pelletier scored, and Vladar made 20 saves for the Flames (13-9-5), who had a six-game home winning streak end.
"I just felt that I had to make one extra save than Binnington, and I didn't," Vladar said. "They got the win, but I think we deserved to win today for sure. The guys played a really good game in front of me. We played good hockey but unfortunately it wasn't enough."
Zack Bolduc gave the Blues a 1-0 lead at 12:49 of the first period on the power play with a one-timer from the high slot on a setup by Brayden Schenn that snuck under Vladar's glove.
Thomas pushed it to 2-0 at 14:49 with a shot off the rush that beat Vladar's blocker, deflected off the post and in.
Pelletier scored 15 seconds later at 15:04 to pull Calgary to 2-1 when he slid a rebound on Weegar's initial point shot under Binnington. Pelletier, selected with the No. 26 pick in the 2019 NHL Draft, was recalled from Calgary of the American Hockey League on Monday after failing to make the team out of camp and clearing waivers.
"It's been a tough year and a half," Pelletier said. "It felt good, to score a big goal. It felt pretty good, to be honest."
Coronato tied it 2-2 at 5:23 of the second period with a wrist shot from the high slot on the power play that beat Binnington blocker side.
Pavel Buchnevich put St. Louis up 3-2 when he tapped a cross-ice pass from Thomas over the goal line at 6:00 of the third period, six seconds after a minor penalty to Martin Pospisil had expired.