The only limit I've ever reached with BNF is that you cannot express permutations of given set of rules, you really have to write every possibility literally.
Being able to recursively generate a rule-set where each level takes the head of a list is very useful.
term = term2 [op1 term]
term2 = term3 [op2 term2]
... and so on for every precedence level. A lot of BNF grammars for simpler languages are dominated by rules following that pattern.