The most important thing for me is absolute addressing of workspaces. Don't think of them as 'going to the next or previous one (or worse, a grid). No, think of it as "My browser is on tab 4", "My chat client and music client are on tab 5". "My editor/IDE is on tab 1", etc. This makes switching between contexts insanely fast and completely painless. You don't need to hunt&pick with your mouse, scroll through lists, etc.
For me on Windows it's: Desktop 1 holds email, mostly "read-only" stuff, and administrivia; Desktop 2 holds the web browser; Desktop 3 is where all the coding happens; Desktop 4 is 'priority-interrupt important task' if it arrives. This was driven by the fact I could only have 4 desktops when I first started using virtual desktops on Windows thanks to the Win9x era PowerToys.
In UNIX / Linux environments, where I too have been using virtual desktops since the OLVWM days >20 years ago, I usually have 6 desktops in a 3x2 arrangement. Similar breakdown, except desktops 1 and 3 are my "primary coding desktops", each w/ usu 3 xterms open on one of two projects, desktop 5 is my primary overflow desktop, and desktops 4 and 6 are for long-running background things that I end up leaving open for months, and/or hot-topic quick one-off things I need to go do w/out disturbing all my other desktops.
Since I went multi-monitor, I've found it actually works really well with virtual desktops if you can pin some windows to be on all desktops. If you have some status-y things that you want to see all the time or nearly all the time on one monitor, while paging through multiple desktops on the other, you can move all those windows to the one monitor and pin them to always be visible on all desktops. It works really nicely for me.