The Toffees went ahead via a Leighton Baines penalty on 20 minutes after Chico Flores had brought down Ross Barkley in the box.
But the Swans were level 13 minutes later when Wayne Routledge picked out Angel Rangel and he crossed from the right for Wilfried Bony to slot home from close range.
After the break, Romelu Lukaku restored Everton’s advantage on 53 minutes after a fine one-two with Kevin Mirallas.
The unmarked Barkley added a third goal five minutes later when heading home Mirallas’ corner.
Swansea responded, with Tim Howard making good saves to deny Bony and Pablo Hernandez before Ashley Williams headed home in injury time to set up a nervy finish.
But Everton held on for the win which sees them leapfrog Tottenham into fifth, a point ahead of their rivals having played a game less.
The win also boosted Everton’s outside hopes for Champions League qualification, with fourth-placed Arsenal’s 6-0 drubbing at Chelsea earlier in the day meaning this victory moved Roberto Martinez’s side to within eight points of the Gunners with a match in hand.
But the task to overhaul Arsenal remains a stiff one and will require both greater application and urgency on Everton’s part combined with something of a collapse from Arsene Wenger’s men.
Swansea have now not beaten the Toffees in 20 meetings – this was their third defeat to their opponents this season – and Garry Monk’s men dropped a place to 15th.
Monk’s side have taken just two points from five matches and will remain in danger until they can shore up a defence which gave away sloppy goals.
The opening goal came via a quick 20th-minute counter-attack after John Stones, continuing at the heart of defence with captain Phil Jagielka not recovered from a hamstring injury, played a first-time long ball from the edge of his own penalty area to Barkley.
The England midfielder raced forward and Flores caught his opponent, who had nowhere to go but down in the box.
Flores argued contact had been made outside, but referee Michael Oliver had no hesitation in awarding Everton their first penalty at Goodison since January 2013.
Baines made no mistake from the spot to make it 12 out of 12 Premier League penalties.
That should have been the signal to raise Everton from their slumbers but they remained strangely lacklustre and Swansea deservedly got themselves back into the game.
Routledge cut in from the left and spotted Rangel’s charge from right-back and picked him out with a great pass before the defender crossed low for Bony to tap in from close range.
Swansea finished the half strongest without creating much in the way of a threat apart from Hernandez’s deflected free-kick which dropped wide of the far post with wrong-footed goalkeeper Howard on his backside.
Whatever was missing in the first half was discovered at the interval as Everton scored twice within 13 minutes of the restart.
First Lukaku played a one-two with Mirallas before scoring from close range.
Then some poor defending at a Mirallas corner allowed the unmarked Barkley to score with a stooping header.
That should have been that but in keeping with the general laid-back tone of the game the home side required Howard to make a fine reflex save from Bony’s header midway through the second half.
Mirallas should have put the game beyond any reasonable doubt after racing forward on a quick breakaway but he fired weakly at Michel Vorm.
Howard spread himself well to save from Hernandez in the last 10 minutes but the skipper was eventually beaten again by Williams’ 90th-minute header.
But the Toffees held on to win and claim a priceless three points.