1. Use MOVE. Unless you KNOW you have efficiency problems after a run-time analysis, do not -- EVER -- worry about performance. The current generation of mainframes performs tens of millions to hundreds of millions of lines of COBOL code for every second of CPU time. Unless you have something being done, literally, BILLIONS or TRILLIONS of times, then you are not likely to ever be able to see performance differences.
2. See the code below -- the Enterprise COBOL compiler does not generate an error for this, so it's something you are doing wrong in your program.
3. Your first problem is that 18 bytes is not enough to store a 17-digit number, a decimal point, and a sign. As for the rest of your question, see the code below.
77 WS-PACKED-DECIMAL PIC S9(15)V99 COMP-3.
77 WS-ZONED-DECIMAL PIC S9(15)V99.
01 WS-VAR.
05 WS-EDITED PIC +9(15).99.
05 WS-PICX REDEFINES WS-EDITED
PIC X(19).
/
PROCEDURE DIVISION.
S1000-MAIN SECTION.
MOVE 123456789012345.67 TO WS-PACKED-DECIMAL.
MOVE WS-PACKED-DECIMAL TO WS-ZONED-DECIMAL
WS-EDITED.
DISPLAY 'SOURCE <' WS-PACKED-DECIMAL '>'.
DISPLAY 'ZONED <' WS-ZONED-DECIMAL '>'.
DISPLAY 'PIC X <' WS-PICX '>'.
produces output of
SOURCE <12345678901234567>
ZONED <1234567890123456G>
PIC X <+123456789012345.67>