Arsene Wenger is looking to lead his side to their highest Premier League finish in 10 years but their chances were dealt a blow as Gomis’ 85th-minute header crossed the line, despite David Ospina’s attempt to claw it away.
Arsenal protested the ball had not gone in but referee Kevin Friend, aided by goal-line technology, was in no doubt as the goal stood to send Swansea to victory.
Garry Monk’s side, who are now well in with a chance of Europa League qualification with two games remaining, also had former Arsenal goalkeeper Lukas Fabianski to thank for their victory as he made a string of excellent saves in the second half.
In particular, a fine double save from Alexis Sanchez and Theo Walcott helped send the Gunners to a first league defeat in 10 and hand Swansea only their second league double over Arsenal.
For the first time in Wenger’s reign he named the same starting line-up for the fifth consecutive Premier League game after Aaron Ramsey was passed fit following a leg injury.
And Arsenal tried to start in the same vein that has seen them win nine of their last 10 league games as Ramsey combined with Mesut Ozil and Hector Bellerin before clipping a cross to Olivier Giroud, who headed over from 10 yards.
Monk had set up to hit Arsenal on the break and it nearly worked as Ashley Williams’s long pass nearly dropped into the path of Nathan Dyer, but Ospina was quickly off his line to head the ball to safety.
Arsenal were trying to pass their way through but it was to Swansea’s credit that all the hosts could muster was Giroud’s curled effort from 25 yards which flew wide of Fabianski’s goal.
The former Arsenal man would have been expecting a busier night but the Gunners failed to register a single shot on target in the first half. However, with 21 of the last 22 goals in this fixture in all competitions coming in the second half of the match, Wenger would have been pleading for patience from his troops and a much improved performance.
And that is what he got as Arsenal probed to make the breakthrough with Bellerin breaking free down the right before crossing for Giroud, but he was beaten to the ball by Federico Fernandez.
Giroud was again in the action in the 59th minute but the impressive Fabianki was in the way, getting down well to his right to make a smart save.
Wenger sent for reinforcements in Jack Wilshere and Walcott and the latter could have made an instant impact when sending Bellerin’s cross goalwards, but Fabianski was well positioned to keep his goal intact.
Ramsey also tested his former team-mate but the keeper’s best moment came in the 78th minute as he first denied Sanchez from close range and then got up to keep Walcott’s effort out.
It got even better for Swansea with just five minutes remaining as Gomis struck the only goal of the match.
The Frenchman was the matchwinner when the two sides met earlier in the season and he was a thorn in Arsenal’s side again as he rose to head Jefferson Montero’s shot over the line. Ospina got across to claw the ball away but it was not enough as Friend awarded the goal with the help of goal line technology.
It sent Arsenal crashing to their first defeat in 10 league matches as they bid to finish in second place behind champions Chelsea. Wenger’s men, who stay third, are now three points behind Manchester City with a game in hand but face Manchester United, who are just two points behind, at the weekend.
Victory moves Swansea, who are a point behind Southampton in seventh and two points behind Tottenham in sixth, firmly into the race for the Europa League as they became the first side to complete a league double against Arsenal this season.
Arsenal: Ospina (6), Bellerin (5), Mertesacker (6), Koscielny (6), Monreal (6), Coquelin (5), Cazorla (5), Ramsey (5), Ozil (6), Alexis (6), Giroud (5).
Subs used: Wilshere (6), Walcott (4).
Swansea: Fabianski (8), Rangel (6), Fernandez (7), Williams (7), Taylor (7), Ki (6), Shelvey (6), Cork (6), Sigurdsson (6), Montero (6), Dyer (6).
Subs used: Richards (5), Barrow (5), Gomis (7).
Man of the Match: Lukas Fabianski