Engelland doubled Calgary's lead midway through the period. He jumped up into the rush and took a cross-ice pass from Kris Versteeg before pulling the puck to his backhand and lifting it over Hutton to put the Flames up 2-0 at 10:30.
Bennett almost put Calgary up by three on a partial breakaway with 1:51 remaining in the period, but Hutton blockered away his shot.
Hutton couldn't stop Bennett 2:16 into the second period. Bennett worked his way off the boards and into the high slot before shooting through a screen to beat the Blues goaltender to extend the Flames' lead to 3-0. Bennett has goals in back-to-back games, and points in three straight games.
Shattenkirk scored on a 5-on-3 power play at 5:49 of the third period to cut the lead to 3-1, but Gaudreau scored into an empty net with 1:11 remaining in regulation to clinch the win.
"We handled the push that they gave," Gulutzan said. "We got into some penalty trouble there. The 5-on-3 goal was a nice shot. We stayed with our composure and I thought that for two periods we were in control of our game and we put it into a position to have ourselves a win and we came through."
NOTES: The Flames went 1-for-3 on the power play, and killed three of four shorthanded situations. Matthew Tkachuk, who grew up in St. Louis, played after sitting as a healthy scratch in back-to-back games. Mark Giordano played in his 600th career NHL game. Freddie Hamilton, Brett Kulak and Jyrki Jokipakka were scratched for Calgary.
UP NEXT: The Flames will host the Ottawa Senators at Scotiabank Saddledome on Friday (7:00 PM MT; SN-Flames, FAN 960).