Alexandre Lacazette scored deep into injury time to deny club legend Vieira a winning return, pouncing after Palace failed to clear a corner and Gabriel Martinelli’s effort was saved.
The Gunners started brightly and led deservedly through Pierre-Emerick Aubameyang after Vicente Guaita’s diving save to deny Nicolas Pepe.
But Palace improved – as the Gunners faded – and Christian Benteke continued his good record in games against the Gunners with the equaliser.
Thomas Partey was caught in possession by Jordan Ayew and Benteke drilled a shot into the bottom corner.
Palace again stole the ball off Arsenal to go ahead, as this time Conor Gallagher dispossessed Albert Sambi Lokonga in his own half, and the visitors broke quickly, with Odsonne Edouard hammering in a shot via the underside of the bar.
Kieran Tierney almost equalised for Arsenal late on but blasted against the bar with his shot.
And it looked as if they were going to fall short before substitute Lacazette steered home a loose ball from close range.
“It was really tough,” Vieira told BBC Sport. “I was really disappointed to concede at the end because the players worked really hard and they deserved those three points. I feel sorry for them today.
“I liked the personality and character we showed. In the second half, we had desire to compete and won the ball quite high.
“This is the part of the game we wanted to improve, being aggressive. lt’s part of the DNA of Crystal Palace.”
Arsenal were understandably aggrieved when James McArthur was only booked late in the first half for a wild kick at Bukayo Saka, who went off injured at half-time.
“It’s a clear red card,” said Gunners boss Mikel Arteta. “He had no intention of playing the ball. I don’t know how, with VAR, he hasn’t been sent off.”
Arsenal move up to 12th with a sixth game unbeaten, while Palace remain 14th after a third draw in a row.