Calgary captain Jarome Iginla also scored for the Flames (4-0), and rookie defenseman T.J. Brodie notched his third goal in two games.
Henrik Karlsson, acquired by the Flames from the San Jose Sharks during the offseason, made 19 saves and earned his second win of the preseason.
Shane Doan scored the only goal for the Coyotes (4-2), who got 24 saves from Jason LaBarbera.
Iginla scored his second goal of the preseason just 17 seconds into the game. Olli Jokinen's initial shot was stopped easily by LaBarbera, but Iginla swatted in the rebound before the Phoenix goalie could cover the puck.
The Coyotes tied it five minutes later when Doan netted his team-leading third goal. Wojtek Wolski intercepted Jay Bouwmeester's failed clearing attempt and sent a pass to the slot, where Doan wristed a shot into the top corner.
LaBarbera made a pair of blocker saves on shots by Jokinen and Mikael Backlund before standing his ground to turn aside another scoring chance by Iginla.
Hagman put the Flames up 2-1 early in the second period when he sent a heavy shot into the top corner over LaBarbera's outstretched glove hand.
Jokinen left the Calgary bench during the second period after playing just three shifts and didn't return.
Brodie then gave the Flames an insurance goal 5:36 into the third when he took a pass from Hagman and fired a low point shot past LaBarbera.