Daniel Ricciardo finished third for McLaren ahead of his teammate Lando Norris, who kept Hamilton at bay for the duration of the race, which was disrupted by a first-lap crash for 2020 Monza winner Pierre Gasly.
The result means Verstappen will start Sunday's grand prix from the front of the grid, with Ricciardo alongside him on the front row, as Bottas will drop to the rear of the field for taking a fresh Mercedes engine before Friday evening qualifying.
At the start, Bottas led easily away from pole, pursued by Verstappen, as Hamilton's slow getaway meant he was forced to defend against Norris's run to the inside of the first corner.
The world champion was then swamped by Ricciardo and Gasly on his left-hand side and as the pack closed together for the first corners Hamilton was squeezed behind the AlphaTauri and Norris on his right to drop to fifth by Turn 2's exit.
As Bottas, Verstappen and Ricciardo ran clear through the long Curve Grande, Gasly, who had briefly tagged the McLaren's left-rear and damaged his front wing as a result, shot off into the gravel when his wing broke apart and went underneath his front wheels.
Gasly skated across the gravel on the outside and crashed into the barriers, bouncing back into the gravel before coming to a stop where the Frenchman climbed out.
The incident meant the safety car was called – just after a clash between Yuki Tsunoda and Robert Kubica between the two apexes of the della Roggia chicane spun the latter around – as Gasly's car was recovered.
The race restarted on lap four of 18, with Bottas romping clear to a 1.6s lead over Verstappen, with Hamilton chasing the two McLarens – both on the soft tyres versus the mediums on the two leaders and the second Mercedes.
As Norris held Hamilton at bay, even as DRS was activated at the start of lap six, Ricciardo quickly fell away from Bottas and Verstappen.
The leaders were the only drivers able to lap in the 1m23s and by lap 10 they were over five seconds clear of Ricciardo.
Bottas and Verstappen exchanged fastest laps, but the Mercedes' advantage never looked under threat as the gap fluctuated towards and then back from the two-second mark approaching the two-thirds-completed mark.
The leading duo continued to pull away from Ricciardo over the rest of the race, with Bottas in command up front – eventually winning by 2.3s.
Ricciardo came home 14.5s behind the winner, with Norris defying Hamilton, who at times was sliding around dramatically in his countryman's wake, to the flag, where Hamilton ended up 20-seconds behind his victorious teammate.
Charles Leclerc led home his Ferrari teammate Carlos Sainz in sixth and seventh – the former recovering from feeling unwell at the end of FP2 to take the start of the sprint race from eighth, where he climbed from in the first lap melee at the opening turns.
Sainz, who's Ferrari had been hastily rebuilt after his heavy FP2 crash at Ascari, came home where he started and ahead of Antonio Giovinazzi.
The Alfa Romeo driver held off the charging Sergio Perez to the finish, with the Red Bull driver involved in the race's other main flashpoint – his attempts to pass Aston Martin's Lance Stroll on lap nine.
After attacking to the outside of Turn 1, Perez cut across the raised kerbs in the runoff beyond and stayed ahead as the pair raced towards Curve Grande.
Red Bull ordered him to give the place back, which he did approaching Ascari on the same lap, and on the next tour Perez pulled off a similar move at Turn 1 to get in front of Stroll and then start his ultimately fruitless pursuit of Giovinazzi.
Stroll finished 10th ahead of Fernando Alonso and Sebastian Vettel.
Tsunoda pitted after his clash with Kubica and recovered back up the order to finish 16th with Kimi Raikkonen's temporary replacement at Alfa Romeo coming home between the Haas cars in 18th, as Gasly was the race's only retirement.
|2||Max Verstappen||Red Bull||2.325|
|7||Carlos Sainz Jr.||Ferrari||27.952|
|8||Antonio Giovinazzi||Alfa Romeo||31.089|
|9||Sergio Perez||Red Bull||31.680|
|10||Lance Stroll||Aston Martin||38.671|
|12||Sebastian Vettel||Aston Martin||41.177|
|18||Robert Kubica||Alfa Romeo||1'05.096|