Haaland’s league-leading 28th top-flight goal this season was redemption for a squandered opportunity before the break that saw the Norwegian striker fire over the crossbar from close range.
Palace did well to frustrate the visitors for 78 minutes but were undone after Michael Olise brought down Ilkay Gundogan to earn the spot-kick.
The result snapped a four-game unbeaten streak at home for the hosts, who remain in search of their first win in 2023.
City swiftly took control after kick-off, Rodrigo testing Vicente Guaita with a fierce volleyed effort to force a quick reaction from the Palace keeper before Jack Grealish wound his way through centre and dragged an attempt just wide of the left post.
Wilfried Zaha missed an early opportunity to put Palace ahead when he misfired from close range but from there the Eagles seemed to settle into the contest, and soon had another good chance when Olise collected the ball from inside his own half.
He went on an aggressive run before crossing to Zaha, whose left-footed effort was not sharp enough to beat Manuel Akanji who stepped into the line of fire to make the block.
The hosts did well to defend another City onslaught, Jeffrey Schlupp winning an aerial battle to deny Haaland the chance to nod in an opener.
City should have gone ahead when Nathan Ake latched onto Silva’s pass and squared to the Norwegian – who began the afternoon with six more goals to his name than Palace had collectively scored all season.
Instead the moment turned into a rare reminder of the striker’s fallibility when he blazed over, and two more scrambling saves from Guaita kept the hosts firmly in the half despite City enjoying the lion’s share of possession.
City had eight attempts before the break to Palace’s two and piled on the pressure after the restart.
They came close to breaking the deadlock after 10 minutes when Grealish won a free-kick in a dangerous position at the edge of the area. Phil Foden stepped up and fired a rocket at goal, forcing another excellent stop from Guaita who dove and pushed the ball past his far post on 57 minutes.
That marked the end of Foden’s evening as he was soon replaced by Julian Alvarez, who tried to make a quick impression when he picked up a fine pass from Silva, pivoting around two Palace shirts at the edge of the area only to became the next City player to instead sky a solid chance to break the deadlock.
City continued to control the pace and flow but Palace remained largely resistant through 77 minutes, when Olise earned the critical punishment.
Haaland stepped up and made no mistake as he fired past Guaita, nearly making it two when he could not head home Grealish’s cross.
Substitute Eberechi Eze missed his moment to make a difference and Zaha’s pass just eluded Naouirou Ahamada as the hosts ran out of time to equalise.