Rosberg had led early on, but the German had to settle for second when, coming under increasing pressure from Hamilton, he ceded the lead by out-braking himself heading into the first chicane.
Felipe Massa claimed his first podium for Williams in third, while team mate Valtteri Bottas fought back from his own tardy start - he dropped from third to 11th in the opening laps - to secure fourth ahead of Red Bull duo Daniel Ricciardo and Sebastian Vettel.
Hamilton had started the race by immediately dropping down the order as software issues hurt his getaway, enabling Rosberg to snatch the lead from McLaren's Kevin Magnussen and Massa.
The Briton's fightback from fourth was aided when Rosberg made a totally unforced error in the Rettifilo chicane at the start of lap nine, which cut his lead from 3.9 to 2.3 seconds. Massa and Hamilton had already passed Magnussen on the fifth lap, with Hamilton then picking off Massa around the outside as the pair headed into the first chicane on Lap 10. After that, the chase was on.
Both Rosberg and Hamilton made single stops, switching onto the hard-compound tyre on laps 24 and 25 respectively, and rejoined just 1.8s apart.
Hamilton was advised to bide his time and wait for the end to attack, but decided his best chance was when his tyres were fresh and quickly set about cutting the gap, keen to put Rosberg under pressure and see what developed.
The answer came on the 29th lap when Rosberg made his second error at Rettifilo, and this time Hamilton went speeding by into a lead he would not relinquish.
Behind Massa, the fight for fourth was in doubt until the closing stages. Vettel seemed to have a lock on it for a while but he'd stopped for tyres as early as the 18th lap and thus was doomed when Bottas got into his stride in a great recovery. The Finn would pick off Fernando Alonso's Ferrari, Jenson Button's McLaren, Sergio Perez's Force India, Vettel and - after a fierce fight - Magnussen to seal the position.
Third and fourth for Williams was a tremendous result, and moved the team ahead of Ferrari and into third in the constructors' standings.
Vettel kept going in fifth but was powerless to defend when team mate Daniel Ricciardo came rushing back up the field in one of the best drives of the afternoon. The Australian had relatively fresher rubber, having pitted on the 26th lap, and took full advantage to dive down the inside of Vettel on the 47th lap.
Vettel was left to fend off Magnussen, Perez and Button, the latter duo having staged an epic fight a few laps earlier. They remained locked in a tense battle until the flag, crossing in that order. Magnussen, however, earned a five-second penalty for running Bottas off track at the first chicane, and therefore dropped down to 10th in the official classification.
Thus Kimi Raikkonen lucked into a sorry ninth for Ferrari on a day when team mate Fernando Alonso's car let him down mechanically, with gearbox problems, for the first time this season.
Daniil Kvyat nearly snatched the final point after a super drive from 21st on the grid, but in the closing stages out-braked himself into the first chicane and only narrowly avoided Raikkonen before running straight on down the escape road, making two spectacular catches to keep his Toro Rosso out of the wall. He finished 11th, ahead of Nico Hulkenberg's Force India, Jean-Eric Vergne's Toro Rosso, Pastor Maldonado's Lotus, Adrian Sutil's Sauber, and Romain Grosjean's Lotus.
Grosjean came under attack late on from Sauber's Esteban Gutierrez and the pair clashed, a collision which earned Gutierrez a drive-through penalty - which was converted into a 20-second post-race penalty.
Caterham beat Marussia fair and square for the first time in a long while, courtesy of Kamui Kobayashi who was 17th ahead of Jules Bianchi. Gutierrez was 19th at the flag, having been delayed when he split his rear tyre pulling over too quickly on Grosjean.
Apart from Alonso, the other retirement was Marussia's Max Chilton, who launched himself into the gravel trap and out of the race at the second chicane on lap six.
Rosberg now has 238 points to Hamilton's 216 and Ricciardo's 166, as Bottas overtakes Alonso 122 to 121.
In the constructors' championship Mercedes's first one-two since Austria takes them to 454 points with Red Bull next on 272. Williams are third with 177 ahead of Ferrari on 162, McLaren on 110 and Force India on 109.