I think in addition to the obvious conceptual differences, the main difference would be how
the code would be synthesized.
And the resulting circuit generated after synthesis.
In the case of assign method, a simple interconnect would be used that to connect different ports. In the case of instantiation, however, there would be new FFs added into the paths based on the signals used during connections. Both methods have their own merits and demerits though. You can also check the layout after synthesis to see how it is interpreted by the compiler, and see the metrics like power consumption, resource utilization and so forth.