I've found that I get dramatically better clients by requiring 50% payment up-front, and then invoicing weekly. People who balk at the 50% terms are likely to be problem customers, and are best avoided anyway. The weekly invoicing helps new clients understand how much software costs, and prevents sticker shock weeks after the project has begun. Once I have an established relationship with a client that I trust, I'm happy to relax the terms for everyone's benefit.
I've found the same thing. On occasion, I'll waive the 50% upfront deposit (or reduce it dramatically). I also don't have any penalty terms; they're a waste of time. If a client is not going to pay on time, they're certainly not going to pay the penalty %age if and when they do pay. Weekly communication is key. And, if you do end up with a client who won't pay, or consistently pays >30days late, you're better off without them. Fire them, politely, and explain why - then move on. There's no need to punish them - there is a great need to get the hell away from them.