Generally around 10 with any bad performing ones removed seems like a good number.
Discussion
Will the client readd them if performance of one relay improves?
The client won’t. You might want to make a note of them to re-add them later. Are you using Damus?
What is the average cost to run a "good" relay?
Check out nostr.watch where you can check things like recent uptime, and latency #[3]