Question: In my experience, the default **sitecore\_master\_index** and **sitecore\_web\_index** work pretty fast with Solr. We have around 1 million documents in the index and it returns a result in between 0 to 10ms. I can also rebuild part of the index using Rebuild Tree button on developer tab, so I don't have to worry that if some part of the index is broken I have to do a full rebuild (which takes a lot of time).

When and why is recommended to create a custom index? What are the best practices here?

Answer: 
I don't think it takes 10 ms when you have complex query with facets. 

The most important reasons for creating a separate index are the following:

1. you can index only the items you need, speeding up (re-)indexation
2. you can index only the fields you really need, speeding up (re-)indexation
3. your index will only contain what you need, making it faster to search what you need
4. you can control when the index gets updated
Next to the reasons already mentioned by our Climber, I would add:

* possibility to tweak the index in all ways possible - you can go really far in this tweaking your fields in the index, or even using custom document options etc
* when in need of (several) ComputedFields, I normally start considering a custom index (so I don't need to include these in the full index)

but as your question already indicated: if you don't need them, don't use them (although I rather like them..)