I don't know a perfect solution either. You can limit the number of consecutive newlines at any stage you like with regex - client-side presave, server-side presave, server-side pre-output, client-side output.
Here's an example for server-side pre-output modification in your theme's template.php file. The plain_text format can be any text filter of your choice and the null case covers plain text (when filter not set). I'm limiting the max newlines to 2 (using {3,}
for 3 instances and above). My generalised regex covers \r newlines as well but this wouldn't be necessary in this use case.
function YOURSUBTHEME_preprocess_field(&$variables, $hook) {
if ($variables['element']['#field_type'] == 'text_long' && // Makes sure this is a text_long field type.
isset($variables['element']['#items'][0]) &&
(!isset($variables['element']['#items'][0]['format']) ||
$variables['element']['#items'][0]['format'] === 'plain_text')
) {
foreach ($variables['items'] as $index => $value) {
$markup = isset($variables['items'][$index]['#markup']) ? $variables['items'][$index]['#markup'] : '';
$markup = preg_replace("/[\r\n]{3,}/", "\n\n", $markup);
$variables['items'][$index]['#markup'] = nl2br($markup);
}
}
}