В возврате по значению нет особых проблем. Например, в Активном Обероне можно возвращать по значению, причина очевидна - многопоточка, где нужны гарантированно немутабельные данные ( для данного конкретного состояния ).
Но Вирт решил, что передача по значению это зло, вот оно в КП и отсутствует. Что касается производительности, то код с передачей по значению может быть, как-раз, производительней, ибо исключает указатели.