I won't bury the lede here. The problem with my Capybara spec suite was that I didn't fully understand how Capybara's implicit waits worked. I made two mistakes in how I write some Capybara specs, and they ended up inflating my test time by a bunch. First, Capybara matchers don't invert themselves when they're called by RSpec's #not_to method if they're inside another method. Second, using Capybara matchers in a conditional will result in a long delay when the matcher is looking for something that will never be there.