In my opinion it's pretty much a must-have except for trivially simple programs. The assembler or program loader would have to make a ton of assumptions without org directives.
The ORG directive is used to place things at specific memory addresses. For instance, a .com program needs to be placed at address $0100. If software is going to be located in ROM then an ORG directive may be required. The org directive usually works independently for different program segments (code, data, bss, stack, tls, rodata, etc). An org directive can usually be omitted but then a value of zero is assumed for the appropriate counter. You are correct in your case if there are separate code and data areas and code and data are identified separately in software it may be possible to omit the org directive. Note that it’s sometimes desirable to place code in the data area, or data in the core area. Most assemblers expect the programmer to identify the area output to.
Usually there is a way to identify which program segment is being output to with additional directives: (code, data).
The org statement can be useful in data areas for identifying I/O locations. For instance, a video buffer may be identified with an org directive. org directives are also often used to identify vector areas which may be required to be at specific memory locations.
The following example shows the program segment being selected (bss, data or code) followed by an org directive for that segment.
Code:
bss
org SCRATCHPAD ; SCRATCHPAD = $FF400000
_inptr dw 0
_bsptr dw 0 ; BASIC storage pointer
org SCRATCHPAD + $AFF8
__brk_stack dw 0
data
org SYSDATA ; SYSDATA = $FFD10000
code 18 bits
org ROMBASE ; start of ROM memory space
Sometimes the org directive has to be used carefully because the assembler wants to see the orgs increasing in address range. This depends on the assembler. Some better assemblers can re-arrange the code and data automatically so that its in order according to the org statements.
Another use for org is to align code in a assembler that doesn't support the align directive. It might be use to origin code at memory page boundaries or on cache lines for instance.