worker_processes должны устанавливаться в зависимости от количества ядер процессора (2 к 1, обычно), а не к памяти. В теории, даже если у вас 100 воркеров, в идеале, каждый из них должен загружать одно ядро на 100%
Вариантов увеличения RPS достаточно много, но кроме общих, которые, как вы указали, уже используете (кеширование, оптимизация), все остальные - полностью зависят от проекта и кода.
Вот неплохая статья о возможных вариантах:
merbist.com/2011/02/22/concurrency-in-ruby-explained
В принципе, вы можете попробовать и простые шаги, как вы написали: взять другой веб-сервер. Например, начать с puma. Она должна потреблять намного меньше памяти и работать в потоках. Хотя, большого увеличения RPS вы врядли заметите. После можно попробовать использовать, скажем, Rubinius (интерпретатор руби с реально многопоточностью) для Puma. А вдруг.
Thin здесь врядли поможет, но почему б не попробовать - дело нескольких минут.
P.S.
Надо заметить, что для серьезного приложения и 200 RPS 4GB - это, обычно, staging для разработки.