Right now, this is actually working as designed - and it's a bit complicated. When a renewal invoice is generated, we go through all cards the customer has on file in order to attempt to take payment. When we do this we generate individual transactions for each attempt, until one succeeds, which handles everything from capturing the payment, checking fraud rules, calling the gateway, getting back information from the gateway, and then either marking the transaction as approved (and in this case the invoice as well), declined, or marked for manual review. This also includes sending out the individual notifications for when any of those events occur for the individual transaction.
So then, the problem becomes determining what notifications to send, and when, since the system automatically determines the appropriate one to send, based on its status. Further, the notifications are centralized and are used for all transactions, including the customer checking out, renewing manually, the administrator manually charging the card, or automatic payment taken so we would need to rework all of those flows as well. So while it seems simple on the surface (and ideal - I agree, though one could argue that it could act as a reminder to the customer that they have an invalid card on file that they should probably update or remove), it's actually a larger change that we will likely have to make in a larger update rather than as a simple bug fix.
In most cases, customers will only ever have one card on file, so typically it's a non-issue (either it works or it doesn't and only one resulting transaction is generated).