This seems like a good use case for Craft's group
filter. I'd recommend reading this page to get a better understanding of how it's used.
Not quite sure what your code looks like but I'll pull this from the above mentioned support article for explanation purposes:
{% set allEntries = craft.entries.section('blog').limit(null) %}
{% for month, entries in allEntries | group("postDate|date('F')") %}
<h3>{{ month }}</h3>
<ul>
{% for entry in entries %}
<li>{{ entry.getLink() }}</li>
{% endfor %}
</ul>
{% endfor %}
So obviously you'd need to adapt this code to your setup, for example, switch out the month grouping for a per-day grouping. Then what I would do is wrap it in a conditional that only works if the postDate is more than three days older than today's date. Then you could use a similar query as the above to display the first three sections individually, (i.e. one for "Today", one for "Yesterday", and one for the day of the week of the third day).
Might not be the best way (curious to see any other answers that might show up), but just the first thought that came to mind from a quick perusal of your question.