For the same reason that you need a semicolon after the end of any other perl statement (e.g.
my @array = split /foo/, $string;).
eval (despite what it can do) is just a function, and is applied the same as any other. Also note that
perldoc -f eval explicitly states that:
"eval BLOCK" does *not* count as a loop, so the loop control
statements "next", "last", or "redo" cannot be used to leave or
restart the block.
Which emphasizes that eval is just a function and not a condition or looping construct that does not need the semicolon at the end.
Also note that eval can be embedded (just like any function) in a statement as well, just as
if($x == eval $y){ ... }.