In general if it is used for just one property it appears that the generated HTML is the same.
For example this code
<td>@Html.DisplayFor(modelItem=>item.Genre.Name)</td>
<td>@item.Genre.Name, This is direct from Item</td>
generates this HTML
<td>myClassNameProperty</td>
<td>myClassNameProperty, This is direct from Item</td>
At the same time now if i want to display all properties in one statement for my class "Genre" in this case,
i can use @Html.DisplayFor() to save on my typing, for least
i can write @Html.DisplayFor(modelItem=>item.Genre) in place of writing a separate statement for each property of Genre as below
@item.Genre.Name
@item.Genre.Id
@item.Genre.Description
and so on depending on number of properties.
3rd party edit
From html-helpers documentation:
An HTML Helper is just a method that returns a string. The string can
represent any type of content that you want. For example, you can use
HTML Helpers to render standard HTML tags like HTML and
tags. You also can use HTML Helpers to render more complex content
such as a tab strip or an HTML table of database data.
To render more complex html mvc custom html templates or custom tag helpers in asp.net core are used.