Everton's striking resources were wiped out completely when Victor Anichebe was ruled out with a back injury - forcing Cahill to play as an emergency attacker.
It did not stop Moyes' side playing a full part in a highly entertaining first 45 minutes, which brought plenty of opportunities for both sides.
Osman shot just wide for Everton early on, but Arteta came even closer after nine minutes when his 25-yard free-kick struck the bar and Fellaini headed the rebound just over.
Moyes lauds 'deserved' victory
City showed plenty of verve and imagination in the final third, with Ireland lofting a finish over the top when he should have done better and Robinho forcing a fine save from Howard.
Howard then kept out Robinho's fellow Brazilian Elano before Arteta's stinging drive brought a fine reaction save from Hart.
City almost took the lead four minutes before the interval when Segundo Castillo conceded possession and Wright-Phillips grazed the bar with a rising drive.
City fans must be sick of me - Cahill
Everton then rounded off the half with Hart doing well to deny Fellaini from 12 yards and Joleon Lescott heading the resulting corner just over.
City had to make a change at half-time, sending on Jo for hamstring injury victim Benjani.
Everton were dangerous again after 58 minutes when Phil Neville's inviting cross looked certain to be headed in at the far post by Cahill, but Pablo Zabaleta got the faintest of touches to make a vital stooping clearance.
The second half had been a much quieter affair, but Ireland brought Howard into action again with 18 minutes left, side-footing a precise finish, which the American dived to his left to save.
Hughes blames players for 'switching off'
City made another change with eight minutes left, sending on Darius Vassell for Robinho, who looked short of full fitness after an ankle injury.
As the game went deep into time added on, Richard Dunne needlessly conceded a corner, and Everton snatched the win as Cahill stole in to send his header low past Hart.
Manchester City manager Mark Hughes:
"We have created chances, hit the bar, but they have set their stall out over the years and have had numerous 1-0 wins and won games at the death.
"You know when the ball comes into the box you have to mark Tim Cahill properly and unfortunately we didn't do that and got his with a sucker punch.
"Maybe we didn't do enough to win the game ourselves, but to lose it at the end was very hard to take."
Everton manager David Moyes:
"I think when you lose the way we did to Aston Villa last week you can go one of two ways, you can either go under or do what we did today.
"It took us a few days to get over Villa but I thought we deserved to win after playing so well. They're great lads and I am delighted with them.
"We had no fit strikers but I thought we did really well and I thought Tim Cahill did a great job for us in several positions and topped it all with a goal."
This page is best viewed in an up-to-date web browser with style sheets (CSS) enabled. While you will be able to view the content of this page in your current browser, you will not be able to get the full visual experience. Please consider upgrading your browser software or enabling style sheets (CSS) if you are able to do so.