He had a shot on goal nine seconds into the extra period, and then as he was about to go off for a change, he curled back with the puck in the Coyotes zone and dropped it to Hamilton, who split two defenders before beating goalie Mike Smith for the win.
"Johnny made a good play and instincts took over for me," Hamilton said. "It's probably better for me when that happens. You don't have time to think about what you're going to do. It was awful nice to see that go in."
WATCH: All Flames vs. Coyotes highlights
Johnson made 27 saves for this 12th win and is 10-2-0 in his past 12 starts dating to Nov. 15.
"This run we're on … it all starts with Chad," Hamilton said. "He's so calm in the net, he makes things look easy, and it's easy to play in front of him. It gives our team confidence. We're playing simple hockey and getting goals when we need them."
That's not happening for the Coyotes (8-13-5), who have scored eight goals during a season-high six-game losing streak (0-3-3) and two goals or fewer in 11 of their past 14 games.
Max Domi scored for Arizona before leaving the game with an upper-body injury after he fought Calgary's Garnet Hathaway late in the second period. He was bleeding from under his left eye.
The Coyotes earned a point two nights after a 4-0 loss at the Chicago Blackhawks.
"Tonight, we had a lot more guys on board and we were in a hockey game because of it," said Smith, who made 33 saves. "We had some emotion in our group and some competing."
The Coyotes outshot the Flames 7-1 over the first 10 minutes of the game, and Domi scored eight seconds after a penalty to Calgary forward Alex Chiasson for goaltender interference ended.
Johnson stopped Doan on a rebound, but he fell on his back and out of the crease. Domi won a stick battle for the puck and slid it into the open net at 7:23 for his fifth goal and a 1-0 Arizona lead.
Doan's assist was the 554th of his NHL career, moving him past Thomas Steen for most in the history of the Coyotes/Winnipeg Jets franchise.