The home side were under pressure early on as Julien Viale tried to volley the ball in from a corner just a couple of minutes after kickoff, but the striker missed the target.
Laval did break the deadlock shortly after, though, as Viale pounced again, blasting the ball past Benjamin Leroy after Evian failed to clear another corner.
Gianni Bruno had a couple of chances to get the Ligue 1 side back on level terms down the other end, but he fired a long-range effort behind, before slicing a low strike wide shortly after.
Evian dominated possession in the first 20 minutes of the second half as they tried to get back on level terms, although it was Laval who came close again just after the hour mark, but Ludovic Soares was able to block Viale's effort.
The hosts started to show more intent in the final 15 minutes, with Fabien Centonze being denied by the woodwork following a header on from Soares.
Any hopes the home side had of securing a late winner were dealt a blow moments later as Mohamed N'Dao was shown a red card for a foul on Adrien Monfray, while Cedric Barbosa was also given his marching orders for dissent from the substitutes' bench.
The visitors were also reduced to 10 men in the closing stages as Erwan Quintin picked up a second booking, leaving the teams completely level heading into extra time.
It was the second-tier side who edged ahead again early in the additional 30 minutes as Adrien Monfray's drive from the edge of the area took a deflection en route, sending Leroy the wrong way.
The home side were back on level terms again just six minutes later, though, as Kevin Hoggas picked up a ball in from Campanharo to tap in from close range.
With neither side able to find the fifth goal, the match went to penalties, with the first six all finding the back of the net, but Campanharo smashed his wide, allowing the visitors to see out the win by converting their remaining two spot kicks.