I believe listtransactions is always stable unless you manually mess with your wallet.dat or use -zapwallettxes.
Reviewing the code, there is no sorting or post-processing in the listtransactions function (rpcwallet.cpp ~line 1200).
No, it is ordered. The listtransactions function gets transactions like this:
CWallet::TxItems txOrdered = pwalletMain->OrderedTxItems(acentries, strAccount);
OrderedTxItems returns a list of all wallet transactions for account
strAccount ordered by the transaction's
nOrderPos.
nOrderPos is set in a way that ensures that all newly-seen transactions are listed later than ones seen earlier, even if the transaction seen later probably came earlier chronologically. I'm not 100% sure that this rule is followed when rescanning, but I think so.
Note that listtransactions internally loops through every wallet transaction each time you call it to ensure the correct ordering, even if you use an offset. This might make it slow for large wallets.