I've pointed out that the answer for things like "what should a loop that never runs its body" have varied.
rebol2/r3-alpha>> type? while [false] ["whatever"] == none! red>> type? while [false] ["whatever"] == unset!
But it's consistent historically that if something runs do  then you get an "UNSET!"
rebol2/r3-alpha/red>> type? do  == unset!
One of the benefits of having lots of different labeled BAD-WORD!s is to stop collapsing all "potentially error-triggering situations" into the same uninformative name.
>> do  == ~empty~
Or maybe that's considered to be where the concept of VOID comes from:
>> do  == ~void~
In either case, you've still got a BAD-WORD! that will be "ornery" and neither true nor false, that (probably?) errors if you try to access it. But by not reporting
~unset~ you're helping to convey that this wasn't the by-product of encountering an unset variable somewhere. It might help people get their bearings more easily.
(I've mentioned some concern about canonizing English into the evaluator mechanics...but maybe it's okay)
We have some cases where emptiness produces pure NULL..the non-valued state. With DELIMIT and its specializations, an all empty block produces the same thing that an all-NULL-producing block produces:
>> if false ["a"] ; null >> unspaced [if false ["a"] if false ["b"]] ; null >> unspaced  ; null >> unspaced compose [(if false ["a"]) (if false ["b"])] ; null
Can anyone think of a case where there's a balance of provable value for something like a
do compose [...] whose contents have all boiled away to be NULL instead of ~void~ ?
You could get the same result by saying do compose [null (...whatever...)] so it's not far out of reach to have a default value of anything you like.