Uruguay goalkeeper Fernando Muslera saved skipper John Mensah and Dominic Adiyah’s attempts after the quarter-final had been locked at 1-1 after extra time.
Two-time World Cup winners Uruguay will now play the Netherlands in the semi-finals in Cape Town on Tuesday.
Ghana could have won the match in the last minute of extra-time but leading scorer Asamoah Gyan sent a penalty crashing off the crossbar after Luis Suarez had been sent off for deliberate handball on the goal-line.
Ghana were bidding to become the first African team to win through to the semi-finals of the World Cup after Cameroon (1990) and Senegal (2002) had fallen in the last eight.
The Ghanaians scored first through Sulley Muntari two minutes into first-half stoppage time before Diego Forlan equalised with a brilliant free kick in the 55th minute.
In a pulsating quarter-final before 84,017 fans, Ghana led after Inter Milan midfielder Muntari let fly with a 30-yard effort which swerved and beat the diving Muslera into the bottom-left corner.
Muntari was having his first start of the tournament after coming in for the suspended Andre Ayew after being close to being sent home.
Muntari, who has a history of clashes with the management of his national side, had a dressing-room bust-up with Ghana’s Serbian coach Milovan Rajevac earlier in the tournament.
Man-of-the-match Forlan equalised with a spectacular direct free-kick 10 minutes after the resumption.
The influential Atletico Madrid star sent his free kick over the three-man defensive wall and beyond Richard Kingson’s reach into the top of the net after Ghana had threatened to take the game away from the Uruguayans.
Both teams went at each other in pulsating end-to-end action with fierce tackles and plenty of goalmouth action before the quarter-final went into extra time.
Uruguay, who last reached the semi-finals in 1970, will be without defender Jorge Fucile for the game after his second yellow card with Suarez also sitting out the game.
Just before half-time Uruguay also lost their skipper and key defender Diego Lugano with an injured right knee and he was replaced by Andres Scotti. News 24