Oh, this is all highly debatable, but I donât want a new time sink 
For example, the real âlearning curveâ here is in communicating exactly what the new possibilities do, and why they can pay off. How theyâre spelled is a trivial learning curve in comparison, for all of them. Nothing whatsoever is actually obvious at first glance to anyone except to a schemeâs proposer. I care much more about how easy it is to remember and use a scheme after itâs first learned. The effort to learn any of these spellings is akin to that needed to step over a line painted on a road. Approximately nothing.
For example, I actually donât remember the precise names of the new optional arguments in separate_arg_sort I do remember âinplaceâ and âiterâ as strings for the other two, although suspect âcopyâ may be a better name than âiterâ (âcopyâ may more clearly contrast with âinplaceâ).
As for readability, theyâre all roughly tied for me (nothing is obvious at first glance, but none can honestly be called baroque, or even mildly challenging).
As for terseness, separate_args clearly wins, but you ranked the other two in the wrong order:
xs.sort(key=ys, keymode='inplace')
xs.sort(key=(ys, 'inplace'))
xs.sort(keylist=ys)
Although nothing about the shortest one plainly says âin placeâ. Then again, nothing in the longer ones plainly says âmust be a listâ; OTOH those will âfail hardâ if you donât pass a list (raise an exception). If you pass a list to the shortest because the name contains âlistâ, and forget that it mutates, tough luck.
I didnât work hard trying to think of other places where Python may decorate an argument with a qualifier, but itâs hardly novel. I guess my earlier int.to_bytes() example is a case of that, though.
Since weâre talking about sorting here, consider the Linux sort command line tool. -k is used to specify âfield numbersâ to sort on, and can be decorated with a large number of one-letter qualifiers to control how a fieldâs characters are to be treated (like ârâ to sort on the field in reverse order, ânâ to interpret the characters as numbers, âfâ to ignore case, on & on).
Nothing on the table here is even remotely novel in computer world at large. And thanks to @blhsing for pointing out some cases where âmutually exclusiveâ arguments are used already in Python.
Iâll add that ArgumentParser.add_mutually_exclusive_group() exists precisely to cater to this possibility.
There are places too where qualifiers modify the interpretation of a primary argument. Perhaps most obviously, re.compile()s primary argument is a string in regexp format, while the optional flags argument can radically change how the regexp behaves.