Having dismissed South Africa for 191, two-time champions India cruised home with 12 overs to spare at The Oval.
In-form opener Dhawan was the key figure with 78 from 83 balls, including 12 fours, while captain Kohli weighed in with a typically elegant 76.
It was a nerveless performance from India, who had come under fire after failing to defend a total of 321 in their heavy defeat against Sri Lanka.
India joins England and Bangladesh in the semi-finals, with the remaining place in the last four going to the winner of Monday’s Group B meeting between Sri Lanka and Pakistan.
Kohli’s men will face Group A runners-up Bangladesh in Birmingham on Thursday as they bid to make the final for the fourth time.
South Africa could have no complaints as they departed the tournament after a second successive defeat.
They will need a far more determined effort to prosper when they face England in one-day and Test action shortly.
Quinton de Kock’s 53 was the only score of any substance from the spineless South Africans, who had three men run out in a wretched performance.
AB De Villiers was especially culpable as he threw away his wicket for the third time in a miserable tournament for the South Africa captain.
After the flurry of South African run outs, India was lucky not to follow suit at the start of their chase. Dhawan called for a single that was never on and David Miller narrowly missed the stumps with Rohit Sharma not even close to making his ground.
Sharma celebrated his escape by smashing a four and a six off successive balls from Kagiso Rabada. Another aggressive shot from Sharma proved his downfall as a mistimed slog was caught behind by Quinton de Kock off Morne Morkel.
Keen to avoid further costly mishaps, India went conservative and scored only 37 from the first 10 overs. But Kohli gradually began to take more risks and his pull to fine leg narrowly evaded the diving Morkel.
After driving Andile Phehlukwayo for a soaring six to reach 21, Kohli edged the same bowler towards Hashim Amla, but the slip fielder couldn’t make a tough low catch.
With such a small target, India was never in danger of falling behind the run rate and Dhawan kept them on cruise control with some lusty blows off Imran Tahir.
Dhawan has been in fine form of late and he brought up his 29th ODI half century, and third in three matches, with a majestic four back down the ground.
As the partnership between Dhawan and Kohli went past 100, it was clear there would be no late fightback from South Africa.
Kohli hardly had to break a sweat as he reached his 68th ODI fifty.
By the time Dhawan was dismissed by Tahir, his side had reached 151 and the large Indian following in the capacity crowd were in party mood.
Fittingly for such a one-sided affair, the winning blow was a huge six from Yuvraj Singh.
India: Rohit Sharma, Shikhar Dhawan, Virat Kohli (capt), Yuvraj Singh, MS Dhoni (wkt), Hardik Pandya, Kedhar Jadhav, RA Jadeja, Bhuvneshwar Kumar, Ravichandran Ashwin, Jaspreet Bumrah
South Africa: Quinton de Kock (wkt), Hashim Amla, Faf du Plessis, AB de Villiers (capt), David Miller, JP Duminy, Chris Morris, Kagiso Rabada, Andile Phehlukwayo, Morne Morkel, Imran Tahir