Both teams scored their first two kicks in the shootout but while substitutes Dayro Moreno and Sebastian Perez scored Colombia’s third and fourth, Miguel Trauco and Christian Cueva missed for Peru.
The result, which came after a dour 0-0 draw that was short on excitement for the 80,000 fans, takes Colombia through to a semi-final date against either Mexico or Chile in Chicago next Wednesday.
“It was a very intense game,” said Colombian goalkeeper David Ospina, who saved Trauco’s kick with his legs.
“This team have played well, we have a great staff and now we need to enjoy the moment before thinking about what’s next.
“You need to be calm at these moments. This stadium is filled with Colombians and they enjoyed it. So now we need to enjoy it.”
Neither side could dominate a game that had 30 fouls but Colombia came closest to scoring through James Rodriguez, who strode forward from midfield in the first half before hitting the post with a shot from 25 yards.
Colombia also had an appeal for a penalty ignored after 53 minutes when Carlos Bacca was bundled over in the box by Renato Tapia.
Peru almost broke the deadlock in the dying seconds but Ospina tipped over a powerful header from Christian Ramos.
The other two semi-finalists will be decided on Saturday when Argentina face Venezuela in Foxborough and Chile take on Mexico in Santa Clara.
The winner of the first game will face the United States in Houston on Tuesday.