In .NET 6 methods are being added to JsonSerializer to serialize an object directly to a JsonElement or JsonDocument:
public static partial class JsonSerializer
{
    public static JsonDocument SerializeToDocument<TValue>(TValue value, JsonSerializerOptions? options = null);
    public static JsonDocument SerializeToDocument(object? value, Type inputType, JsonSerializerOptions? options = null);
    public static JsonDocument SerializeToDocument<TValue>(TValue value, JsonTypeInfo<TValue> jsonTypeInfo);
    public static JsonDocument SerializeToDocument(object? value, Type inputType, JsonSerializerContext context);
    public static JsonElement SerializeToElement<TValue>(TValue value, JsonSerializerOptions? options = null);
    public static JsonElement SerializeToElement(object? value, Type inputType, JsonSerializerOptions? options = null);
    public static JsonElement SerializeToElement<TValue>(TValue value, JsonTypeInfo<TValue> jsonTypeInfo);
    public static JsonElement SerializeToElement(object? value, Type inputType, JsonSerializerContext context);
}
Thus in .NET 6 you will be able to do:
using var jsonDocument = JsonSerializer.SerializeToDocument(new MyClass { Data = "value" });
or
var jsonElement = JsonSerializer.SerializeToElement(new MyClass { Data = "value" });
Notes:
- JsonSerializerContextand- JsonTypeInfo<T>are newly exposed in .NET 6 and provide metadata about a set of types, or a single type- T, that is relevant to JSON serialization.  They are used when serializing using metadata and code generated at compile time. See Try the new System.Text.Json source generator for details.
 
- JsonDocumentis- IDisposable, and in fact must needs be disposed because, according to the docs:
 - 
- JsonDocumentbuilds an in-memory view of the data into a pooled buffer. Therefore, unlike- JObjector- JArrayfrom Newtonsoft.Json, the- JsonDocumenttype implements- IDisposableand needs to be used inside a- usingblock.
 
 - In your sample code you do not dispose of the document returned by - JsonDocument.Parse(), but you should.
 
- The new methods should be present in .NET 6 RC1. 
In .NET 5 and earlier a method equivalent to JObject.FromObject() is not currently available out of the box in System.Text.Json.  There is an open enhancement about this, currently targeted for Future:
In the interim you may get better performance by serializing to an intermediate byte array rather than to a string, since both JsonDocument and Utf8JsonReader work directly with byte spans rather than strings or char spans, like so:
public static partial class JsonExtensions
{
    public static JsonDocument JsonDocumentFromObject<TValue>(TValue value, JsonSerializerOptions options = default) 
        => JsonDocumentFromObject(value, typeof(TValue), options);
    public static JsonDocument JsonDocumentFromObject(object value, Type type, JsonSerializerOptions options = default)
    {
        var bytes = JsonSerializer.SerializeToUtf8Bytes(value, type, options);
        return JsonDocument.Parse(bytes);
    }
    public static JsonElement JsonElementFromObject<TValue>(TValue value, JsonSerializerOptions options = default)
        => JsonElementFromObject(value, typeof(TValue), options);
    public static JsonElement JsonElementFromObject(object value, Type type, JsonSerializerOptions options = default)
    {
        using var doc = JsonDocumentFromObject(value, type, options);
        return doc.RootElement.Clone();
    }
}
And then call it like:
using var doc = JsonExtensions.JsonDocumentFromObject(new MyClass { Data = "value" });
Or, if you need to use the root element outside the scope of a using statement:
var element = JsonExtensions.JsonElementFromObject(new MyClass { Data = "value" });
Notes:
- As noted above, a - JsonDocumentneeds to be disposed after being created.
The above- JsonExtensions.JsonElementFromObject()extension methods correctly dispose of their internal document and returns a clone of the root element, as recommended in the documentation.
 
- Serializing to an intermediate Utf8 byte sequence is likely to be more performant than serializing to a - stringbecause, according to the docs:
 - 
- Serializing to UTF-8 is about 5-10% faster than using the string-based methods. The difference is because the bytes (as UTF-8) don't need to be converted to strings (UTF-16). 
 
- For the inverse method, see System.Text.Json.JsonElement ToObject workaround. 
Demo fiddle here.