Manu Trigueros (min. 50) y Cédric Bakambu (56) adelantaron a los amarillos, pero el galés Gareth Bale (64), el portugués Cristiano Ronaldo (74), de penal, y Álvaro Morata (83) dieron la vuelta al resultado.
En la primera parte el Villarreal dominó a un Madrid muy espeso, aunque lo hizo sin llegar a concretar, y se tuvo que sobreponer además a la lesión de su arquero, Sergio Asenjo (35), sustituido por Aitor Fernández.
Los blancos, sin embargo, salieron con otro aire tras el descanso, mucho más incisivos, y primero Benzema (46) y después Cristiano Ronaldo (47) probaron al meta local.
Pero el Villarreal acabó pronto con las anspiraciones 'merengues' y, dos minutos después (49), Trigueros hizo el 1-0 al empalmar un rechace del brasileño Marcelo.
Con el gol los amarillos retrocedieron varios metros y le dieron la iniciativa al Madrid, que comenzó el acoso.
Y de nuevo, cuando los capitalinos comenzaba a desperezarse, el Villarreal volvió a golpear. Esta vez a través de Bakambu, que aprovechó un pase al hueco de Bruno para ganarse la carrera a Sergio Ramos y definir con la zurda (56).
Dos minutos después Zinedine Zidane quitó a Casemiro, que estaba protagonizando una actuación muy gris, y sacó a Isco Alarcón.
La entrada del malagueño enseguida se notó sobre el juego de su equipo. Fue él el que, apenas cinco minutos después de haber saltado al campo, habilitó para Dani Carvajal, quién templó un centro al al área que Bale mandó dentro de un cabezazo (64).
Los blancos se volcaron entonces al ataque y en el minuto 71 el árbitro pitó penal a su favor.
Pena máxima que no se ejecutó hasta tres minutos después por las airadas protestas del banquillo del Villarreal y que se saldaron con la advertencia del colegiado al entrenador y a Roberto Soldado.
Cristiano no falló desde los 11 metros y puso el empate (74) y Morata, que salió en el 77 por Benzema, anotó de cabeza en el 83 a pase del brasileño Marcelo.
Resultados de los partidos de la 24ª jornada del campeonato de fútbol de España:
Viernes:
Las Palmas - Real Sociedad 0 - 1
Sábado:
Alavés - Valencia 2 - 1
Betis - Sevilla 1 - 2
Leganés - Deportivo 4 - 0
Eibar - Málaga 3 - 0
Domingo:
Espanyol - Osasuna 3 - 0
Atlético de Madrid - Barcelona 1 - 2
Athletic - Granada 3 - 1
Sporting - Celta 1 - 1
Villarreal - Real Madrid 2 - 3