After Kompany had spectacularly put into his own net to level the scores with 20 minutes remaining, Navas and Milner struck as City lifted their game to claim just a third Premier League away win this season.
A week ago, after beating Arsenal 6-3 at home, City were being lauded as title favourites, but their Jekyll and Hyde nature at home and away continued.
Both the good and bad of City were in evidence against a Cottagers side fighting for their top-flight status.
Restored England goalkeeper Joe Hart - making his first Premier League appearance since the October 27 loss at Chelsea - dealt comfortably with everything Fulham, and Adel Taarabt, in particular, threw at him in the first half and City were clinical at the other end.
After David Silva hit the bar, Yaya Toure netted his ninth goal of the season with a stunning free-kick and Kompany added a second two minutes before the interval.
City were cruising, until Fulham pulled a goal back with a devastating counter-attack converted by Kieran Richardson and then the scores were levelled when Kompany spectacularly sliced a Sascha Riether cross into his own net.
Navas and Milner ensured their captain's embarrassment would not linger and that City would enter the Boxing Day clash with form side Liverpool with momentum.
Hart displaced Costel Pantilimon in the Premier League line-up to keep his place following the midweek Capital One Cup win at Leicester, with Gael Clichy starting at right-back.
Dimitar Berbatov was absent for Fulham and Alex Kacaniklic on the bench in a side showing two changes following the loss at Everton, with Taarabt and Richardson brought in.
Fulham, with Clint Dempsey watching on amid talk of a return next month, made a lively start but needed a City error to first test Hart.
A Clichy slip on a surface made greasy by incessant rain allowed Richardson to go by him down the Fulham left and he fed the ball inside for Taarabt, whose shot through Clichy's legs was saved.
The effort sparked City into life and a cross from Negredo found Edin Dzeko at the back post.
The striker turned and laid the ball off for Silva to hit a crisp strike which beat Maarten Stekelenburg, but rebounded off the bar.
Silva was then fouled by Steve Sidwell on the edge of the Fulham area, giving City a free-kick in a dangerous position.
There was little doubt Toure would take it and the midfielder curled a delightful effort which kissed the underside of the crossbar before nestling in the net.
With Taarabt prominent, Fulham had half chances, but City were dangerous on the break and should have gone two up when Aleksandar Kolorov crossed for Dzeko, whose casual side-footed effort was saved by Stekelenburg.
Dzeko had a header saved as he stretched to reach a lofted ball before Fulham defender Philippe Senderos departed injured, with Fernando Amorebieta.
Taarabt then could not capitalise on a slip by Martin Demichelis, who had a significant role in City's second.
The Argentina defender saw his header from a Silva free-kick saved, but only as far as Kompany, who prodded in.
City resumed on the attack and 90 seconds after the restart Kolorov crossed for Silva to slide in, but Stekelenburg made a sharp save.
Silva lost possession as City tried to find an opening on the edge of the Fulham box and the hosts countered with the ruthlessness of their visitors.
Taarabt broke down the left, out-pacing Clichy and Demichelis, and charged into the area, drew Hart to his near post and crossed for Richardson to tuck in.
Sidwell had a half chance and City reacted to the Fulham pressure by replacing Dzeko with Navas, who fired narrowly wide after the ball broke for him following Silva's beautifully-weighted pass to Alvaro Negredo.
Fulham deservedly equalised in fortuitous circumstances following a Riether cross from the right.
Kompany attempted to clear, but merely succeeded in comically slicing a left-footed clearance over Hart and into his own net.
As Fulham attempted to build further pressure, City struck with a goal made by two Spaniards and scored by another.
Negredo fed Silva, who played in Navas with a perfect through ball.
Navas still had plenty to do as he out-paced Amorebieta and shot through the legs of Stekelenburg.
Stekelenburg was soon beaten again, killing off any hope of a second Fulham fightback.
Negredo found himself wide on the right, but played an outrageous pass with the outside of his left foot into the box where Milner ghosted in and netted to complete victory.