Oh-kay. I have been foollowing the code down the rabbit hole, and I am a bit out of my depth here, but what I see are two things:
1) (ext:default-directory) calls another function CD, which can change the directory. If without an argument, the argument is created by merging (the non-argument) with defaults and doing logical path translation, then it actually changes the directory and returns the pathname calculated before (the new path to which it changed the working directory).
So querying the default directory comes about as a side effect, sort of.
2) I am not sure about what actually happens in this default thing, but what seems certain, we're doing a call to chdir(2) every time (which has no effect when the argument is the working directory already except when the dir is unlinked (**)). We would have to call 1 system call anywhere here, but this ... and then I don't know if it doesn't call getcwd anyway in this default/normalizing stuff.
And the version comes in from the place where the "empty argument" is expanded into a pathname.
I think I'll really be circumventing this all. Instead of UIOP:GETCWD (which calls EXT:DEFAULT-DIRECTORY) I'll just redirect my GETCWD wrappe to (osicat:current-directory). Which, BTW, does the right thing.
But really, I am not sure if I shouldn't try to raise a bug here (not for the implementation, I am understanding it not good enough to judge it, but rather for the spurious :VERSION which also cannot be deleted). Any advise?