Real Madrid had the chance to go back to the top of the table with a win at Villarreal, but instead they lost.
Yeremy Pino put the hosts in front, but a questionable call against Juan Foyth allowed Benzema to tie the game.
Foyth won a penalty of his own after David Alaba handled the ball.
Real and Barcelona are tied at the top of the points table.
It was a deserved third successive win for the Yellow Submarine, having created the better chances throughout the game.
Alex Baena and Francis Coquelin both hit the post in the first half as the hosts dominated.
Benzema fashioned Real's best first-half opening with a first-time pass on the volley for Vinicius Jr but the Brazil forward was denied by the veteran keeper.
After a ball over the top grazed Foyth's hand, the referee awarded a penalty after watching the pitchside monitor.
Benzema moved into sixth place on the all-time top scorers' list with a goal.
The hosts felt no injustice as Alaba slipped and handled Foyth's low pass as he put his hand on the ground to steady himself, with Moreno calmly sending Thibaut Courtois the wrong way from the spot.