If you can use accounts, I recommend doing so. They encourage you to use best practices, and there are few reasons not to use them.
The accounts code does not scale up to thousands of accounts with tens of thousands of transactions, because by-account (and by-account-by-time) indices are not implemented. So many operations (like computing an account balance) require accessing every wallet transaction.
bitcoind scans the wallet transactions for any kind of balance lookup.
getbalance only scans the wallet once per account, whereas manually tracking addresses with
getreceivedbyaddress causes bitcoind to scan the wallet once per address. So using accounts may be faster in some cases. Accounts may accumulate many old/unused addresses over time, which can slow things down, but you can do things to prevent/fix this if it becomes an issue.
If accounts are far too slow, raw addresses will probably also be too slow. You'll need to use caching or raw transactions in this case. But both of these things are difficult to do safely (maybe deceptively so for caching), so it's best to start out with accounts and only change things when you need to.