I've upgraded our two CS300's from 2.1.X through 2.3.16, so about 6+ firmware upgrades without any issues at all.
As for procedures we start with the DR array first, wait a few days, then do the production array using the following steps:
1. We verify dual connections for all hosts via Monitor > Connections.
2. Verify the array controllers have all connections up.
3. Perform upgrade.
4. Verify connections again.
Our practice is to upgrade our disaster recovery site first, give it a week to confirm performance, then upgrade our production. In both cases the work has always been done in regular business hours. No issues for us at this point. We've gone through about 6 code upgrade cycles. Each upgrade takes us about 15 mins to complete. If you're not confident in your network and path failover capability then you probably want to do this with Nimble Support since they'll verify all of that with you before starting the upgrade.
Only 1 time have I had an issue, and it did not affect production at all. The web interface would not come back up after an upgrade (this was a while ago and I would have to dig up the specifics if you wanted details). Support had to remote into my system to bring some web service up manually. Never an issue since.