With the scores goalless following regulation time, penalties were needed to decide who moved into the last four at MetLife Stadium in New Jersey.
James Rodriguez, Juan Cuadrado, Dayro Moreno and Sebastian Perez all converted their spot-kicks for Colombia in the shoot-out win, as goalkeeper David Ospina produced a stunning save with his foot to deny Peru’s Miguel Trauco, before Christian Cueva put his penalty over the bar, sealing their elimination.
The win means Colombia move into the semi-finals of the Copa for the first time since 2004 following consecutive exits at the quarter-finals stage, with a final-four showdown with either Mexico or Chile looming.
After resting several of his stars for their final group game against Costa Rica, Colombia coach Jose Pekerman named his strongest line-up, with the likes of James, Cuadrado, Carlos Bacca and Ospina all returning.
Peru coach Ricardo Gareca, meanwhile, only made the one change, with Renato Tapia coming in for Adan Balbin.
A bright start for Colombia led to an early chance for Bacca, but the AC Milan forward was dragged too wide, eventually letting off a shot that was just off target.
It was a fiery opening with several passionate challenges however Colombia continued to edge the game, creating the better of the chances.
The next opportunity fell to James in the 22nd minute, with the Real Madrid attacker seeing his shot cannon off the post.
Neither side were able to craft any clear-cut chances on goal for the rest of the half, with the scores deservedly locked at 0-0 going into the break.
Both sides were awarded early free-kicks in the second half, but poor deliveries let them down.
It was the story of the half, with Colombia and Peru failing to find that decisive last pass, seeing a number of promising attacks come to nothing.
Bacca had the best chance of the half approaching the 80th-minute mark after being played in by a ball over the top of Peru’s defence, but he failed to make contact on the shot.
Colombia defender Farid Diaz, already on a yellow, escaped seeing red after a foul on substitute Cristian Benavente just outside the area, which the referee waved away.
But the 32-year-old was later carried off on a stretcher after falling awkwardly, replaced by Fabian Fabra in stoppage time.
Peru won a late corner through captain Paolo Guerrero but Ospina produced a stunning save to deny the leaping Christian Ramos, as the game went to a penalty shoot-out.
With Colombia scoring all four of their penalties, the pressure was on Cueva after Trueco’s spot-kick was saved, but the 24-year-old skied his effort as Peru bowed out.