Why should we avoid including both blocking and unblocking assignment in same always block?
The standard reason is that it can lead to differences in behaviour between simulation (which will do the blocking assignments in a proper 'blocking' sequential fashion) and synthesis (which will not do blocking assignments in synchronous blocks in the way you might hope).

Of course, those differences may not matter, and the design may work when synthesised anyway but you really don't want there to be any functional difference between synthesis and simulation.