The problem is not dbms_output , but SQL * Plus.
Using
SET SERVEROUTPUT ON FORMAT WRAPPED
or
SET SERVEROUTPUT ON FORMAT TRUNCATED
to save spaces.
From the documentation (PDF) of SET SERVEROUT WORD_WRAPPED (which is the standard):
SQL * Plus leaves the alignment of each line, skipping all leading spaces.
Peter Lang
source share