Hamilton was spun round at the first corner by Vettel's Ferrari team-mate Kimi Raikkonen, but turned in a masterful display, and took advantage of two safety car periods to finish behind Vettel.
Raikkonen crossed the line ahead of Valtteri Bottas, who had led with only five laps of the race remaining.
Vettel strengthens his stranglehold on the championship, and will now head to his home race in Germany in a fortnight's time with an eight-point advantage.
Hamilton secured pole 24 hours earlier, but his getaway here was slow and it was not long before Vettel had passed the Brit for the lead with Bottas following suit.
Raikkonen was then all over the back of Hamilton's Mercedes gearbox, and the Finn locked up at the right-handed turn three and slammed into his opponent.
Hamilton was sent spinning round, and suddenly he found himself down in 18th and with it all to do.
Raikkonen was at fault for the coming together and the stewards concurred as they slapped the Ferrari driver with a 10-second penalty.
While Vettel led from Bottas at the front all eyes were on Hamilton and his comeback drive through the field.
Cheered on by the vast majority of 140,000 partisan fans, Hamilton was driving like a man possessed, and was picking off his opponents with ease.
By the end of lap three, Hamilton was 14th. Three laps later he was into the points after passing Kevin Magnussen's Haas, and on lap 11 he was up to sixth having dispatched of Nico Hulkenberg's Renault.
Remarkably the defending champion had made up 11 places in just 10 laps.
The front-runners all stopped for fresh rubber, promoting Hamilton to third. Hamilton stopped for new tyres after 25 laps and dropped back to sixth.
Hamilton was 29 seconds behind leader Vettel and 11 behind Raikkonen, but he was turning in the quickest laps of the race, and when Daniel Ricciardo stopped for a second time, he was up to fifth.
Then the race took another unexpected twist when Swede Marcus Ericsson crashed out at 200mph.
The Sauber driver emerged unscathed, but the safety car was sent out. Both Ferrari and Red Bull drivers took advantage of the safety car to stop for fresh tyres, but Mercedes left both of their cars out.
Bottas would assume the lead from Vettel, with Hamilton now third. The Brit, however, was straight on the radio. "There is no way I am going to be able to compete with these guys on old tyres," he said.
The response from his race engineer Pete Bonnington was simple. "You're the fastest out there by miles," he said. "It is all there. Don't give up."
After the Sauber wreckage was cleared, the race resumed only for Romain Grosjean to collide with Carlos Sainz at the high-speed Copse corner.
Out came the safety car again. With 11 laps remaining, the race started once more. A blanket could be thrown over the leading four cars as they scrapped for position.
Bottas, on old tyres, was starting to wane, and with five laps to go Vettel perfectly executed his move at Brooklands to take the lead.
Hamilton made his way past Bottas on the following lap, with Raikkonen then taking his countryman for third, and that is how the leading four cars would cross the line in a frenetic ending.
Final Positions after Race (52 Laps):
1 Sebastian Vettel (Ger) Ferrari 1hr 27mins 29.784secs
2 Lewis Hamilton (Gbr) Mercedes GP 1:27:32.048
3 Kimi Raikkonen (Fin) Ferrari 1:27:33.436
4 Valtteri Bottas (Fin) Mercedes GP 1:27:38.667
5 Daniel Ricciardo (Aus) Red Bull 1:27:39.284
6 Nico Hulkenberg (Ger) Renault 1:27:58.004
7 Esteban Ocon (Fra) Force India 1:27:59.714
8 Fernando Alonso (Spa) McLaren 1:28:00.899
9 Kevin Magnussen (Den) Haas F1 1:28:02.972
10 Pierre Gasly (Fra) Scuderia Toro Rosso 1:28:03.913
11 Sergio Perez (Mex) Force India 1:28:04.492
12 Stoffel Vandoorne (Bel) McLaren 1:28:05.558
13 Lance Stroll (Can) Williams 1:28:07.890
14 Sergey Sirotkin (Rus) Williams 1:28:17.897
15 Max Verstappen (Ned) Red Bull 46 Laps completed
16 Carlos Sainz (Spa) Renault 37 Laps completed
17 Romain Grosjean (Fra) Haas F1 37 Laps completed
18 Marcus Ericsson (Swe) Sauber-Ferrari 31 Laps completed
19 Charles Leclerc (Mon) Sauber-Ferrari 18 Laps completed
20 Brendon Hartley (Nzl) Scuderia Toro Rosso 1 Laps completed
Join our new commenting forum
Join thought-provoking conversations, follow other Independent readers and see their replies