With 20k messages/day I think your laptop can bear this workload. Don't worry too much about performance in this low-demanding regime.
Keeping data normalized has many benefit including faster writes and less risk for bugs.
Also Contract Start and End Date can be changed based on business logic
Inlining the contracts table would force you to update those dates in many places. That is more dev work, slower and more potential for bugs. This is the prime argument for normalization.
I am just worry about scalability for the case a Contract is having a new relation with a new table.
Adding a new relation with contracts will make a normalized approach even more attractive. You don't want contracts data to be inlined into multiple other tables.
Denormalization is also a valid technique but I don't think it applies to your case.
I recommend that you start with a normalized data model, index it well and do a quick performance test. You'll likely find that everything is fine.