espèces # works as expected, results in translation of 'species'
espèce # works as expected, results in translation of 'species' with context 'singular'
Espèces # works as expected, results in translation of 'species' without context, capfirst applied
Espèce # works as expected, results in translation of 'species' with context 'singular', capfirst applied

OK, I'll leave a reproduction example below if anyone will be interested, but after some more digging I found out what the issue was.

Within django/django/utils/translation/trans_real.py file there was an inline_re regex and this regex was badly constructed - up to Django 1.8.18. There was no "filters" block between translated string and a "context" keyword, so construction

{% trans 'string'|capfirst context 'context' %}

couldn't be recognised properly. This issue was fixed in Django 1.9.

So that's it. If you are still using Django 1.8 and need a fix for it use