In my opinion, you are overthinking it. I would write my functions in readable and simple ways, and if those end up returning nil or empty seq in the case of an empty coll, so be it. Unless I know the function will be used in a specific context which really needs it to be nil or empty seq, I wouldn't go out of my way to make it one or the other. It would be whichever naturally falls out of the simplest and clearest implementation I found.
The performance perspective is similar. This is a micro-optimization, and to enforce it as you mentioned, you might need to pollute the readability and simplicity of the code such as when you'd now need to deal with conj or others. It also seems like it be pretty hard to maintain that pattern consistently, since it depends only on good intentions. So I also think you're overthinking it here as well. Similarly to before, I wouldn't concern myself with such a detail, unless I'm in an absolute performance critical use case, and I've exhausted all other approach, and my profiling indicates that getting rid of seq for emptiness checks in my conditions could shave off a reasonable amount of time, then only would I bother, and still only for the profiled functions which showed hot spots around it.