The problem you described is related to difference in logic of catalog price rule vs shopping cart price rule.
Catalog Price Rule - is defining a unit price of a product and affect product view/listing pages, it works the same way as special price functionality, but on a group of products.
This functionality is taken to find a final price, that is calculated on as minimal value from such options: product price, special price, tier price, group price, catalog rule price.
Shopping Cart Price Rule - is affecting a final price that you have already in a shopping card, there is no relation, if it is a rule or a tier or a group product price.
In your situation there are only two options, that you can choose, in order to not sell products that cheap:
Remove catalog product price and make 50% shopping cart price rule for your sale products. In this case you should specify that shopping cart price rule processing should be stopped after applying 50% discount. Also sort order of it should be a high number. Also for your special coupon code discount, you need to do the same, but sort order should be lower then 50% rule, it can be applied first. In this case, if coupon is specified - only 25% rule is applied, otherwise 50% discount rule.
Add products that are under your catalog price rule as an exemtion from 25% discount. For this purpose you'll need to specify the same conditions as in your catalog price rule, but with a logical NOT combination.
If you'd like to learn more about the pricing logic in Magento you can check one of my presentation on the conference:
https://www.youtube.com/watch?v=Dzf7lypb9gs