Roman Cervenka also scored and Alex Tanguay added a late short-handed goal to wrap up the win for the Flames in a game that featured the bottom two teams in the NHL.
Now, they're three points clear of Colorado in a race to stay out of the league's cellar.
"I don't want to say it was one of those games that we had to win, but we are obviously extremely happy, and hopefully we can get a winning streak going," said forward Roman Horak, who had two assists as his team won on the road for the first time since Feb. 17 at Dallas. "It was huge for us."
Brad Malone scored his first NHL goal for the Avalanche, who have dropped five straight games. That his team couldn't generate any more of an offensive attack infuriated veteran goalie Jean-Sebastien Giguere.
"We spend too much time in our own zone. That's hard. We know we can score some goals, we have some offensive tools, but when you spent part of your second period and you give them too many scoring chances, it's not going to win games like that," Giguere said. "We talk about it every day. At some point, we have to understand. There's no more excuse. It's not about being young. We have to put our head into the game."
MacDonald came up big late in the third period, stopping a point-blank backhanded shot by Matt Duchene and weathering back-to-back hooking penalties on Cervenka in the final 5 minutes.
"It has been awhile since we won," MacDonald said. "It's a nice win."
Tanguay gave the Flames some breathing room when he skated in all alone and beat Giguere over his right shoulder with just over 3 minutes remaining. Down two goals and up a skater with 2 minutes left, the Avs pulled Giguere but couldn't score.
These days, the bounces simply aren't going Colorado's way.
"You work for your bounces," Avs coach Joe Sacco said. "When we get chances right now, we're not having the ability to finish them off. We're around the cage but we're not finishing them off."
There was a scary moment early in the third period when referee Brad Meier was hit in the left leg by a puck that an Avalanche defenseman was attempting to clear. Meier crumpled to the ice and stayed down for several minutes before gingerly skating into the dressing room.
Trailing 1-0 midway through the second period, Cervenka tied the game when he beat Giguere with a wrist shot. Six minutes later, Horak took advantage of an Avalanche miscue to corral the puck near the goal and quickly flipped it to a wide-open Cammalleri, who shot the puck over Giguere's shoulder.
It was Cammalleri's 12th goal of the season. The goal also helped the Flames snap a five-game losing streak. Their last win was at home on March 27 against Colorado.
Malone gave the Avalanche a lead early in the second period when he tipped in a shot from Tyson Barrie. Malone was just called up from Lake Erie of the American Hockey League last week. He's known more for his physical presence -- he led the Monsters with 99 penalty minutes -- but also had 10 goals.
"Getting that first one is great, but it's about winning in this league," Malone said.
The Flames dominated a penalty-filled first period, but couldn't score on Giguere. They even had a 5-on-3 opportunity for 1:36 that only produced two shots.
This is a season that's gone downhill for both Calgary and Colorado. They're now contending not for a playoff spot but for the first pick of the NHL draft this summer.
"Right now this game is about what kind of percentage we are going to get on the draft picks," Tanguay explained. "It's hard to get motivated for that. We are professionals. We show up. It's not a good situation."
For Duchene, being in last place is "embarrassing," especially since he thought this team could contend in a lockout-shortened season.
"We were right there for a while and hit the skids," Duchene said. "Had we gone the other way, we're in a playoff spot. But it came to that crunch time and we weren't able to perform way we should have."
Calgary center Jiri Hudler (upper body) didn't play against the Avs. He's day to day, coach Bob Hartley said after the game. ... Tanguay scored his fifth career short-handed goal. ... Avs F Paul Stastny (foot) will practice Tuesday and may play Wednesday in Anaheim. Stastny has missed the last eight games. ... F Milan Hejduk (shoulder) skated with the team Monday morning, but isn't any closer to a return. ... The Avs were 6-for-6 in killing penalties on Monday.
Copyright by STATS LLC and The Associated Press
DENVER, CO - APRIL 8: Matt Stajan #18 of the Calgary Flames warms up before NHL action against the Colorado...