McLaren's Lando Norris rounded out the podium but he was gifted third place when Ferrari's Charles Leclerc flew off the track late in the race.
Leclerc had changed tyes in an effort to chase down Perez and set the fastest lap but he misjudged a tricky chicane and bounced up off a sausage kerb and off the track.
The championship leader was in third at the time and had his sights set on second place, but he did well not to crash out of the race completely and recover to finish in sixth.
The slip-up means Leclerc's lead in the drivers standings has been trimmed to 28 points ahead of Verstappen, who has leapt up into second overall.
Former world champion Nico Rosberg told Sky Sports: "Charles Leclerc, oh my god.
"If you're fighting for a championship against Max Verstappen, you just cannot allow yourself to spin out there when you're just driving on your own.
"Yes, he was hunting down Perez but the pressure was on Perez, not on Charles. To spin like that, my goodness.
"He has to avoid that for the rest of the season if he wants to win the championship. That was a really tough one."
It was a day to forget for Ferrari at their home race, with Carlos Sainz ruled out of the race when he collided with Daniel Ricciardo on the very first corner on the opening lap.
Sainz was fuming and believed Ricciardo was at fault for the incident, but he wasn't penalised.
It's the second race in a row Sainz has failed to finish after he spun off the track at the Australian Grand Prix.
"Ferrari are the ones that are going to feel like they've been punched in the stomach after today," Sky Sports commentator Paul Di Resta said.
"What could they have done to get some luck? With all that momentum, all that red in the grandstand, it's just not happened."