PPPoE has some overhead: 8 bytes per packet. See here. So it needs more packets to send the same amount of data, thus effectively reducing bandwith.
Obviously, 8 bytes per packet should not half the bandwidth if the packets are big enough (1000-1500 bytes).
iperf uses sufficently small packets (64 bytes perhaps?) the overhead should be enough to give the results you're experiencing.
You could also be experiencing fragmentation, i.e.
iperf tries to send 1500 bytes packets while PPPoE should have a
1492 MTU. Try the
-M, --mss n
set TCP maximum segment size (MTU - 40 bytes)
To be safe pass it a value of 1400:
iperf -c X.X.X.X -M 1400
Also, try running it for some time, like 60 or 120 seconds
iperf -c X.X.X.X -M 1400 -s 60 # or 120