Brad Malone scooped up the puck and gave it to his goaltender, a souvenir to mark Ward's 500th NHL appearance.
The Hurricanes (22-30-7) played a sound all-around game to ensure the evening was memorable for Ward, who made 23 saves.
"It was clear that our guys wanted to put in a really strong effort and I really appreciate that," said Ward, who has 240 NHL wins. "It makes it a lot sweeter when you can walk out of here with a win."
Ward, who admitted to being nervous in early minutes, made a strong save on Claude Giroux to shake the jitters. Then in the third period, he stopped Michael Del Zotto with his right pad before making a diving stick save on Sean Couturier.
"His rebound control was making it a lot easier for us as far as clear-outs go," Hurricanes captain Eric Staal said. "He was swallowing a lot of pucks. When he's feeling it, not a lot comes off of him. He controls the play a lot."
The Flyers (26-24-11), who were on an 8-1-4 run, missed a chance to gain on the Boston Bruins, who hold the second wild card into the Stanley Cup Playoffs from the Eastern Conference. Philadelphia trails Boston by four points.
The Hurricanes took advantage of their first power play for a 1-0 first-period lead. After peppering goalie Rob Zepp with a handful of shots, Justin Faulk scored on a high, short-side shot from the right circle at 7:29. Faulk later had an assist, giving him a Hurricanes-high 38 points.
"He's that good, and we need him to be that good," Ward said. "He's an all-around guy who can really push the pace and make everyone around him better. He really gives you confidence when he's on the ice."
Philadelphia tied the game 1-1 when Jakub Voracek circled the net, outworked three Carolina defenders and left a backhand pass for Nicklas Grossmann, who scored his fourth of the season on a wrist shot at 17:46.
Jeff Skinner made it 2-1 at 2:16 of the second period when Semin threaded a pass through four Philadelphia defenders. Skinner, driving the net, received the pass on the forehand and quickly sent it past Zepp for his fifth goal in seven games.
"Heck of a pass to get it through there," said Skinner, who has five goals in his past seven games. "I had a little bit of an angle, but sometimes you just put [the stick] down there and he finds it. It was a pretty nice pass."
The Hurricanes scored again on the power play after Chris VandeVelde tripped Michal Jordan in the Carolina defensive zone. Faulk hit Semin with a pass at the top of the crease, and after Zepp stopped him point-blank, Jordan Staal scored on the rebound at 15:55 of the second. Semin earned his second assist and finished with a season-high seven shots.
Philadelphia allowed 11 shots on four Carolina power plays, something Flyers coach Craig Berube said was part of a larger problem.
"When you don't have energy and emotion, you lack execution with the puck," Berube said. "That to me was the big thing, not getting the puck out, not making plays, and then offensively just not enough. There were some good shifts where we had offensive-zone time and opportunities but not enough overall."
Malone gathered a loose puck behind the net and fed Jay McClement in front for his fourth goal of the season with 5:23 remaining in the third period.
Ward is the 64th NHL goaltender to reach 500 games.
"It's fun playing in front of him, I think that's the way to put it, because you always have a chance to win," Faulk said. "He gives you that every night when he's in net, and he does more than that by stealing games for us once in a while and getting the two points."
Hurricanes coach Bill Peters said, "He's been real good here for a long time. He's elite, in my opinion. I love the way he handles the puck, and I love his demeanor. We're lucky to be getting the type of goaltending we're getting each and every night, whether it's Ward or [Anton] Khudobin."