Miguel Trauco scored the decisive penalty for Peru in a shoot-out that echoed the drama match with two shots over the crossbar and three saves.
Peruvian keeper Pedro Gallese set the stage for Trauco with his diving save of Alberto Espinola's attempt.
Paraguay captain Gustavo Gomez had opened the scoring in the 11th minute, but Gianluca Lapadula scored in the 21st and 40th to give Peru the lead.
Paraguay's prospects looked bleak when Gomez was sent off moments before halftime, but Junior Alonso pulled them level in the 54th minute.
Yoshimar Yotun's 80th-minute strike put Peru up 3-2, but after Andre Carillo was sent off in the 84th to reduce the Peruvians to 10 men Gabriel Avalos grabbed a last-minute equalizer to force the penalty shoot-out.
Peru will battle for a place in the final against the winner of Friday's other quarter-final between Brazil and Chile in Rio de Janeiro.
Lapadula said they would be ready for either. "Between Chile and Brazil, it's the same thing," he said. "We have a semi-final and we have to think about that."
The quarter-finals will conclude on Saturday when Argentina take on Ecuador and Uruguay face Colombia.
Peru Copa America Paraguay