Perez rebounded from Red Bull team orders that denied him a chance to race for the win one week ago to pick up his first Formula One victory of the season.
Perez earned his third career F1 victory after a questionable strategy call by Ferrari cost pole-sitter Charles Leclerc a win on his home circuit.
Although Leclerc finished the race for the first time in four tries, he finished fourth and allowed reigning world champion Max Verstappen to extend his lead in the points standings. Carlos Sainz Jr. finished second for Ferrari and Verstappen was third for Red Bull.
Verstappen now leads Leclerc by nine points in the standings; Leclerc has two wins this season, Verstappen and Perez have combined for five victories as Red Bull and Ferrari have claimed all seven races.
But the win on the slick city streets of Monaco went to Verstappen's teammate just one week after Perez was ordered to cede the lead to Verstappen during the Spanish Grand Prix. Leclerc had dropped out of the race with an engine failure and Red Bull chose to capitalize by manipulating the finish to get Verstappen the win in Spain.
The team promised Perez he'd be allowed to race for wins and held its word Sunday.
"You dream of winning this, and after your home race, there is no place more special to win," Perez said after waving the Mexican flag. He is third in the standings and only six points behind Leclerc.
Red Bull team principal Christian Horner patted Perez on the back as he walked alongside the driver following the race. Perez is in a contract year and both Red Bull and Perez have said discussions on an extension would ramp up over the summer months.
"Checo was sensational," Horner said. "It's very tough in conditions like that but we got the calls right."
Horner joined Perez on the podium and Perez struggled to hold back tears as he puffed his cheeks and wiped his eyes while the Mexican anthem played.
"It's a massive day for myself and my country. I am very happy. I was wearing a Pedro Rodriguez helmet," Perez said. "I am sure he was looking down on me and hopefully he would be very proud."
Rodriguez, a Mexican driver who won two F1 races, died in 1971.
Verstappen celebrated with Perez, whom he considers the best teammate of his career.
"Amazing result for Checo," he said. "Very pleased for him."
Leclerc led from the pole and screamed in rage when told to pit for a second tire change on Lap 22 — at the same time as Sainz. His engineer realized the mistake and yelled "stay out!" but it was too late and Leclerc returned to the track in fourth.
"What are you doing?" Leclerc shouted.
After the race, he lectured Ferrari again.
"No words, no words. We cannot do that," he radioed.
Ferrari team principal Mattia Binotto accepted the team made the wrong call for Leclerc.
"I know he's not happy. It's normal that he's not happy because we only made mistakes. If you're first and end up fourth it's obvious something didn't work," Binotto said. "We should have stayed out. We'll look at why we made that decision."
Leclerc also won the pole a year ago but never got to start because he crashed at the end of qualifying, and the car's gearbox failed moments before the start. In 2018 and 2019, Leclerc had retired from the race with crash damage.
The race was delayed by 70 minutes for heavy rain and began from a rolling start behind a safety car. It was then red-flagged on Lap 30 after Schumacher's heavy crash three laps earlier sliced his Haas car in two. He escaped unharmed.
"I'm fine, very, very upset not to finish the race," Schumacher said. "I don't know why the car split in two."
George Russell finished fifth for Mercedes ahead of McLaren's Lando Norris and the Alpine of Fernando Alonso. Seven-time F1 champion Lewis Hamilton was eighth for Mercedes — extending his winless run with the Silver Arrows to eight races — while Valtteri Bottas was ninth for Alfa Romeo and Sebastian Vettel 10th for Aston Martin.
"Crazy afternoon. I thought the rain would make it more exciting but we struggled still on our cars," Hamilton said. "Probably one of the worst (starts to the season)."
Relentless rain drenched the track 20 minutes before the scheduled start at 3 p.m. local time.
The field initially lined up and completed a delayed formation lap behind the safety car. But drivers climbed from their cars when the rain intensified and it became clear Sunday's start would be delayed. They sheltered in their garages as teams used makeshift tents to protect the cars.
When the rain subsided enough to start the race, Leclerc led the field on a rolling start and started clocking fastest laps.
Then came a team order that played straight into Red Bull's hands and left Leclerc despondent in Monaco.