The Pacific islanders, 8-3 down at half-time, fully deserved their win as both teams scored three tries. The reverse means England head to the World Cup in France on a run of five defeats in six matches.
Fiji were 12 points ahead early in the second half. Although England closed to within a point, the visitors pulled clear with a try seven minutes from time by replacement Simione Kuruvoli.
England desperately needed a win ahead of a tough Pool D World Cup opener against Argentina in Marseille on September 9, but instead suffered a defeat that raised fresh questions about their defence.
Fiji, meanwhile, will be buoyant in the run-up to a World Cup they begin against Wales -- the team they knocked out in 2007 in France -- in Bordeaux on September 10.
"I am so proud of the boys, this win is for all the people back home in Fiji," wing Selestino Ravutaumada, the player-of-the-match, told Amazon Prime.
'Not good enough'
England captain Courtney Lawes, winning his 100th cap, admitted: "It is just not good enough. We are where we are at the minute and all we can do is push on.
"We need to get our attack together. We are just turning over too many penalties and today we didn't attack well enough."
England kicked-off without regular captain Owen Farrell and No 8 Billy Vunipola following the pair's recent red cards.
The experienced George Ford, playing at fly-half instead of Farrell, kicked England into an early lead with a penalty in front of 56,854 spectators -- a far smaller attendance than the more than 80,000 that watched world champions South Africa inflict a record 35-7 defeat upon New Zealand at Twickenham on Friday.
Recalled wing Jonny May ended England's more than six-hour wait for a try by a back when he fended off his opposite man before going over in the corner in the ninth minute after sharp passing by scrum-half Alex Mitchell.
Ford missed the conversion but England were 8-0 ahead.
As rain lashed down, Fiji's first attack ended with Caleb Muntz kicking a penalty.
The wet weather, accompanied by thunder and lightning, made handling difficult.
With Fiji down to 14 men after prop Eroni Mawi was sin-binned for pulling down a maul, England pressed for a try from an attacking line-out.
But Fiji's defence held and England had to be content with an 8-3 lead at half-time.
Early in the second half, Ravutaumada beat May and found Waisea Nayacalevu on his inside.
With Muntz converting, Fiji, despite still being a man down, led 10-8.
They went further ahead in the 52nd minute when left wing Vinaya Habosi burst through a ruck for a try.
Muntz again converted and the fly-half's penalty four minutes later extended Fiji's lead to 12 points.
England pulled a try back heading into the final quarter when replacement Marcus Smith raced on to Ford's chip ahead.
With Ford converting, 2019 World Cup finalists England were just five points behind.
But following Mitchell's high tackle, Muntz made it five from five from the tee with a 46-metre penalty.
England hit back when replacement back Joe Marchant went in for a try at the corner.
Ford converted. Fiji led by just 23-22 with 12 minutes remaining but scored next after controlling possession following a knock-on at the restart by England replacement scrum-half Danny Care.
The side-stepping Ravutaumada proved too much for England's defence and he sent in Kuruvoli for a try between the posts duly converted by Muntz.