That is only cleaner if the default function (list1 in this case) is Memoize'able, and reasonably fast (or already memorised). For example, if list1() was really $iter->(), where &$iter was a sub reference that iterated over all possible combinations of some other list. Calling it twice has the side effect of missing every other entry. And you have about a 50% chance of having do_it_right() return an empty list or undef or whatever shows the termination of the iteration from list1() depending on whether the number of combinations is odd or even.
Or, let's say list1() was long-running. e.g., looking data up on a web page, pulling data from a remote database server, finding the time it takes for 4 pings to a server in another country. You don't want to call it twice.
So, yes, for the given sample data (which I thought was obvious that it was merely sample, and not actually representative of real code), you're right, that may work fine. But then you're missing the point of the meditation: the convenience of the || operator in scalar context (each item evaluated once and only once), and how I mistakenly thought that this applied in list context, even though, as brian_d_foy points out, perlop explicitly says not to do it.
| [reply] |