Barcelona introduced former Arsenal striker Thierry Henry as a 77th-minute substitute for Ibrahimovic, drawing a rapturous reaction from the fans who cheered him during his eight successful years in north London, but it was the home side that scored next.
Fabregas was preparing to shoot from a cushioned header by Nicklas Bendnter when his legs got tangled with those of Puyol, who was trying to challenge him from behind.
The referee ruled that it was a foul and sent off Puyol. Fabregas got to his feet and hit the kick down the middle of the goal as Valdes dived to his left.
Fabregas said he thinks he damaged his fibula when he was fouled, making it worse when he hit the kick with force.
"We have to wait for tomorrow, but I hope I can wear the Arsenal shirt again this season," Fabregas said. "I fear the worst, which is that I have broken something."
A prolonged absence would severely threaten Arsenal's surprise challenge for the English Premier League title and could even have an impact on Spain's attempt to add the World Cup title to its European Championship.
Arsenal is third in the Premier League, just four points behind leader and defending champion Manchester United, while Spain kicks off its World Cup against Switzerland on June 16 in Durban.
In Milan, CSKA Moscow goalkeeper Igor Akinfeev kept his side in the match with crucial saves while his counterpart Julio Cesar had little to do other than deny striker Tomas Necid late on.
Milito got the crucial goal when he controlled Wesley Sneijder's pass on the edge of the area, turned quickly, and shot into the corner.
Bayern Munich beat Manchester United 2-1 in another quarterfinal on Tuesday, when Lyon beat Bordeaux 3-1.