An important point to remember is that using slot-value or with-slots
will go directly to the slot rather than running the accessor methods,
and so if you have, say, a :before daemon on a slot, it won't get
called. This might cause a bug, or at least a modularity violation
that could lead to future bugs. If you need to anticipate the
possibility of such daemons, then I doubt there's a way to avoid two
dispatches.
Possibly your program could use defstruct, which would make everything
cheaper, in most implementations of CL.