They indicate why in your second link:
When using POCO entity types, lazy loading is achieved by instantiating derived proxy types at runtime, and then overriding virtual properties to add a boot hook. To get lazy loading of related objects, you must declare the attributes of the navigation properties as public, virtual (redefined in Visual Basic), and not sealed (NotOverridable in Visual Basic). In the above code, the navigation properties of Category.Products and Product.Category are virtual.
The only drawback that I see is that, like any virtual method, they will run so slightly slower than a non-virtual method. Most likely, you will never be able to detect a difference in performance.
You will see a delay in the first access to these properties, as lazy loading means that the first reading will lead to a database query.
source share