Santi Cazorla proved his class as he scored twice for Villarreal to deny Real Madrid a chance to make further inroads on La Liga leaders Barcelona.
The visitors, who made a pre-Christmas trip to the Club World Cup, looked tired and faced a rejuvenated Cazorla, who has suffered a long injury lay-off.
His curler earned an early lead before Karim Benzema’s header made it 1-1.
Raphael Varane nodded in to put Real ahead, but Cazorla’s late header moved Villarreal out of the relegation zone.
Santi Solari’s Real remain fourth, seven points behind Barcelona, four behind second-placed Atletico Madrid and two behind third-placed Sevilla.
Real’s night was not improved by Gareth Bale being substituted at half-time with what appeared to be a calf injury.
And they were made to pay by a Villarreal team, who merited at least a point for their superior attacking endeavour and had a midfielder who showed why he was so revered while at former club Arsenal.
Real struggle to lift themselves after reduced break
Real had six days’ less rest than Villarreal coming into the game thanks to their Club World Cup win in Abu Dhabi, which came on 22 December.
And after a frustrating season where they replaced former manager Julen Lopetegui with Solari in October, they appeared to lack sharpness as they were tested from the start by Nigerian 19-year-old Chukwueze, who has been linked with Arsenal.
The teenager tested Courtois before setting up Cazorla’s opener and was a constant thorn in Marcelo’s side down the Villarreal right.
The visitors’ two headed goals seemed to catch out Villarreal goalkeeper Sergio Asenjo on both occasions, but he redeemed himself when saving from Lucas Vazquez in the second half when the Real forward was clean through on goal.
Bale made little impact before he was replaced by Isco, but it was Luis Garcia’s home team who posed the greater threat in the second period and their equaliser was fully deserved as they boosted their hopes of staying in the top flight by moving above Athletic Bilbao on goal difference.