Rookie Austin Watson scored his first career goal at 3:17 of the third period to break a 2-2 tie and
Matt Halischuk followed with an insurance goal that turned out to be the game winner at 4:40.
Halischuk's goal offset Roman Cervenka's late goal for the Flames and snapped Nashville's eight-game losing streak.
Cervanka had two goals for the Flames, who had won three consecutive games before arriving in Music City. His first goal on a breakaway at 7:06 of the first period staked Calgary to a 2-1 lead.
T.J. Brodie also scored for Calgary. Mikka Kiprusoff made 28 saves on 32 shots.