Palace had the better of a poor first-half in which both teams lacked attacking quality with Yannick Bolasie going closest with a rare chance.
Cameron Jerome somehow hit the bar from four yards early in the second-half before Puncheon’s fine finish gave Palace the lead.
Julian Speroni miraculously denied Andreas Weimann in the dying minutes to leave Palace seven points clear of relegation with just five games to play.
As with all kick-off times across the country the game began at 3.07 to commemorate those who died in the Hillsborough disaster 25 years ago.
And it was Tony Pulis’ side - the form team heading into the game - who began the better with Puncheon volleying over from an early cross.
Palace’s unchanged starting XI were forced into an early change as Marouane Chamakh replaced Kagisho Dikgacoi due to injury in the 19th minute.
And the change seemed to disturb Palace as Villa, aiming to avoid a fourth straight loss, gained a foothold in the game.
During a rare spell of pressure for the away side Palace had to rely on Jerome’s goal-line clearance to prevent Ciaran Clark’s header giving Villa the lead.
But neither team looked comfortable in possession during an opening period that lacked quality.
A well-worked Palace free-kick found Bolaise unmarked just before half-time but his miss-hit strike trickled harmlessly wide from six yards out.
Palace should have taken the lead in the 53rd minute.
Brad Guzan saved well from Bolasie before the ball fell to Jerome in the six yard box but he could only hit the bar from the rebound.
The game plunged into controversy in the 67th minute when Webb awarded Palace a penalty as Clark was adjudged to have blocked Bolasie’s cross with his arm.
However, after consulting with the linesman, Webb changed his mind sending home fans into a state of disarray.
But Palace had their goal soon after as Boalsie’s cross found Puncheon who turned well before firing into the bottom corner.
Puncheon nearly made it two with five minutes left but could only hit the post from 10 yards out.
Villa looked to have scored a late equaliser when Weimann latched onto a Grant Holt header but Speroni pulled off a marvellous save to ensure all three points from the Eagles.
Palace team: Speroni, Ward, Marriappa, Dann, Delaney, Ledley, Jedinak, Dikgacoi (Chamakh 19), Puncheon, Bolasie (Parr 83), Jerome (Murray 75).
Unused subs: Hennessey, Ince, Gayle, Gabbidon