Verstappen had earlier lost the lead by running off track ahead of the race's second corner, before gaining first place back when the power of the undercut caught out Mercedes at the first pitstops.
But, with all the drivers struggling more with tyre degradation than had been expected in what were cooler conditions at Paul Ricard on race day compared to the rest of the weekend, this time it was Red Bull that gave up track position for the second half of the race to set up another grandstand finish along the lines of the 2019 Hungarian GP and the 2021 race in Spain.
At the start, Verstappen led Hamilton away from the front of the grid and looked in command as he ran through Turn 1, but as he swept around the fast left-hander and began to move towards the Turn 2 right, the Red Bull driver had to catch a sudden slide.
Verstappen was suddenly heading right when he should have been positioning his car to the left ahead of Turn 2 and had to run off track as he caught the slide, keeping tight to the bollards on the inside of the second corner.
As Verstappen was catching his slide and running off, Hamilton steamed around Turn 2 and the Red Bull inside kerbs to easily move into the lead.
From there, Hamilton built a 1.4-second lead by the end of the first lap, despite having to catch his on lurid slide coming onto the pit straight at the end of lap one of 53.
The leaders quickly dropped Sergio Perez, running in P4 in the second Red Bull, as Hamilton ran untroubled up front and Bottas pressured Verstappen's second place – dipping in and out of DRS threat towards the end of the opening 10 laps.
The three leaders were the only cars able to lap regularly in the low-mid 1m39s throughout the opening stint, where Hamilton calmly built a solid lead over Verstappen.
The gap had just about reached three seconds when Mercedes brought Bottas in at the end of lap 17 to switch his starting mediums for hards, after drivers who had stopped earlier and were running in the pack – Charles Leclerc and Daniel Ricciardo – made gains with an undercut.
Red Bull reacted by bringing Verstappen in at the end of the following lap and the Dutchman was able to return comfortably in net P2, now also on the hard tyres.
Hamilton made the same switch a lap later, but Verstappen stunned him by making into Turn 1 ahead as the Mercedes, which was stationary for a tenth of a second less at its stop compared to the Red Bull, was still getting back to speed.
Verstappen was back in front by under immense pressure from both Mercedes, who ran in DRS range behind the net leader (Perez led until he stopped at the end of lap 24 having cycled to the front when the runners in front came in).
For the 10 laps after Verstappen retook the lead, Hamilton was able to run within a second, but, as the leaders discussed the possibility of turning their expected one-stop strategies into two stops, the gap began to edge out.
By lap 32, Verstappen led by 2.2s as he was able to stay in the 1m37s bracket, while the following Black Arrows cars slipped beyond that into the mid 1m38s, but at the end of that tour Red Bull called the leader in to go back to the mediums.
Once he had completed his out-lap, Verstappen had an 18s gap to close back to the lead and he began to carve into that advantage by around two seconds a lap as he ran in the mid 1m36s versus Hamilton's mid 1m38s.
Perez waved Verstappen by at Turn 11 on lap 35, with Mercedes telling Hamilton the catch would depend on how long it took his title rival to battle by Bottas and if Verstappen could keep his mediums in better shape than most drivers managed in the first stint.
Verstappen reached Bottas with 10 laps to go, his rate of catching the two Mercedes cars slowing after his initial onslaught, with Hamilton in particular getting back to regularly lapping in the 1m37s, as they all had to make their way through backmarker traffic.
On lap 44, Verstappen closed on Bottas with DRS down the first half of the Mistral Straight, and when the Mercedes defended to the inside of the first part of the Turns 8/9 chicane Bottas ended up losing momentum.
That allowed Verstappen to get alongside on the run down the rest of the straight and he retook second as they swept through Turn 10, Signes, which gave Verstappen 5.1s to close on Hamilton over the final nine laps.
The gap initially only came down in small bursts, but as Hamilton toured back in the 1m38s as the distance to go ticked under five laps, Verstappen was able to gain the best part of a second a lap as the traffic between the leaders disappeared.
At the start of the penultimate lap, Verstappen was finally within DRS range – the gap at 0.7s – and he seized the lead back at the first opportunity, heading into the chicane on the Mistral Straight.
Verstappen had closed in rapidly with DRS, and although Hamilton defended to the inside, the Red Bull as able to get alongside on the left-hand side approaching Turn 8 and Verstappen sealed the lead at the apex of the first part of the chicane/
He pulled clear over the final lap and a third, winning by 2.9s, with Perez coming home third ahead of Bottas as the Mexican driver was able to bring his offset one-stopper tyre life advantage to bear in the closing stages.
Perez took third sweeping around the outside of Signes on lap 49, with Bottas furious he had not be switched to a two-stopper.
Lando Norris was another driver to make late stop on the one-stopper work to his advantage, as he climbed the order to finish fifth and ahead of teammate Ricciardo.
Pierre Gasly finished seventh ahead of Fernando Alonso, with Sebastian Vettel and Lance Stroll coming home in the final points paying positions after starting on the hards – Stroll from the last row of the grid – and running deep into the race before coming in.
Leclerc, the first driver to pit in the race, tumbled down the order as his hards wore out, and he was eventually put on a two-stopper, which left him down in P16.
Carlos Sainz also struggled for tyre life in his Ferrari, finishing 11th having started fifth, with George Russell beating the pitlane-starting Yuki Tsunoda to P12.
|1||Max Verstappen||Red Bull|
|3||Sergio Perez||Red Bull||8.811|
|9||Sebastian Vettel||Aston Martin||1'19.666|
|10||Lance Stroll||Aston Martin||1'31.946|
|11||Carlos Sainz Jr.||Ferrari||1'39.337|
|15||Antonio Giovinazzi||Alfa Romeo|
|17||Kimi Raikkonen||Alfa Romeo|